Point polygon kryds i SQL - 💡 Fix My Ideas

Point polygon kryds i SQL

Point polygon kryds i SQL


Forfatter: Ethan Holmes, 2019

opdatering: Som læserne bemærket er det ikke 0 grader længdegrad, der er problemet, det er 180 grader, hvor du kan støde på problemer. Jeg har også undslippt gt og lt symbolerne. Det er jeg ked af.

Jeg tilbragte weekenden at deltage i F1 Website Challenge, en kodende maraton, hvor konkurrerende hold hver producerer en mytisk mandmands websitet til en værdifuld ideel organisation - alt i løbet af 24 timer.

En af de udfordringer, som mit team står over for under udviklingen, var at finde en effektiv måde til at opdage en bestemt servicegruppe for en given adresse. Vores klient, Metro Meals on Wheels, har en række forskellige regioner, hvor de leverer måltider, hvor hver region serveres af en bestemt Meals on Wheels organisation. Disse regioner er defineret af ikke-overlappende komplekse polygoner. Det er ikke så enkelt som en normal sælger søgning, hvor du vender tilbage til den nærmeste adresse til den ønskede adresse. I stedet skal du søge i en database med polygoner for at finde den, der krydser adresseplaceringen.

En af mine holdkammerater, Mark Seemann, endte med at give en ret elegant løsning på problemet, og kunne implementere det i en simpel SQL-forespørgsel. For at finde ud af om et punkt krydser en polygon, er det lige så enkelt at tegne en vektor fra punktet og se, hvor mange linjestykker af polygonen det krydser. Hvis tallet er lige, er det uden for polygonen. Hvis det er mærkeligt, har du et kryds.

Så lad os sige, at du har en polygon database, der har en række for hvert linjestykke af en polygon. Du kan hurtigt trække alle segmenter, der skærer en vektor, der peger direkte øst for din geografiske placering som denne:

VÆLG poly_id, segment_id FRA segmenter HVOR (lng> thelng OR lngb> thelng) OG ((lata> thelat og latb <thelat) ELLER (latb> thelat og lata <thelat))

Det vil returnere dig en liste over alle linjestykker, som du ville krydse, hvis du gik direkte øst fra placeringen på [thelat, thelng] (ja det går ud fra, at du ikke krydser 180 grader). For at bestemme polygonen (eller polygoner), der skærer vores adresse, er det lige så enkelt at gruppere ved poly og returnere alle rækker, der har et ulige antal matches:

SELECT poly_id, COUNT (segment_id) AS segment_count FRA segmenter WHERE (lnga> thelng OR lngb> thelng) OG ((lata> thelat og latb <thelat) ELLER (latb> thelat og lata <thelat)) OG segment_count% 2 = 1 GROUP Ved polyid

Selvfølgelig er verden ikke flad, selvom jeg har behandlet det på denne måde for enkelhed. Hvis du ønsker at dette skal fungere for alle tilfælde, skal du begrænse din søgning til en bestemt afstand og oversætte koordinaterne, så søgningen ikke krydsede 180 grader længdegrad.



Du Kan Være Interesseret

Drone Crashes på White House Lawn; Pilotkrav Fritidsmæssige formål for flyvning

Drone Crashes på White House Lawn; Pilotkrav Fritidsmæssige formål for flyvning


Se fire Disney-kunstnere male et træ

Se fire Disney-kunstnere male et træ


Et nærmere udseende - Craft-Tea Tea Cosy

Et nærmere udseende - Craft-Tea Tea Cosy


SÅDAN GEOTAGG del.icio.us bogmærker

SÅDAN GEOTAGG del.icio.us bogmærker