Daugiau

PostGIS ST_Buffer Radius Help

PostGIS ST_Buffer Radius Help


Bandau rasti visus taškus penkių mylių spinduliu nuo tam tikro taško. Turiu tokią užklausą:

SELECT * FROM table WHERE ST_Contains (ST_Buffer (geomFromText ('POINT (0 0)', 4326),?), Latlon)

Neįsivaizduoju, ką įdėjau į vietą?(spinduliu), kad gautumėte penkias mylias. Viskas yra EPSG 4326, ir pagal „PostGIS“ dokumentus (kiek galiu geriausiai pasakyti), mano spindulys turėtų būti metrais. Jei įdėsiu 12 070,0 m (maždaug 5 mylių), aš gausiu rungtynių pusiaukelėje visoje šalyje. Ar kas nors žino, ko man trūksta?


Kadangi jūsų duomenys nėra projektuojami - tai yra rutulio formos taškai - linijiniai atstumai nėra prasmingi. Penkios mylios ties pusiauju yra daug mažesnis kampas nei 5 mylios poliariniu apskritimu. Bet, laimei, „PostGIS“ (> = 1.5) turi atsakymą, kurio ieškote:

SELECT * FROM table WHERE ST_DWithin (ST_GeogFromText ('SRID = 4326; POINT (0,0)'), geografija (latlon), 12070);

Tai turigeografijatipas, skirtas būtent tokiems dalykams. Tai panaši į geometriją, tačiau ji naudoja tik EPSG: 4326, o su ja veikiančių funkcijų yra daug mažiau.

Aukščiau esančiame pavyzdyje aš iškviečiau ST_GeogFromText () (taip pat yra ST_GeographyFromText (), ir aš nesu tikras, ar yra skirtumas) dominančioje vietoje (ji gali veikti su įprastu WKT, nes SRID parametras yra nereikalingas) ir perkelkite „Latlon“ stulpelį į geografijos tipą. Jei tai darote daug, gali būti efektyviau sukurti lentelėje geografijos stulpelį ir visiškai praleisti aktorių sąrašą. Galiausiai, ST_DWithin () gali paimti geografinius parametrus ir teisingai elgiasi tiesiniais atstumais.


galbūt vietoj to norite funkcijos ST_DWithin. žr. pastabą st_buffer doc.
ST_Buffer

Žmonės dažnai daro klaidą naudodamiesi šia funkcija bandydami atlikti spindulio paiešką. Buferio sukūrimas radijo paieškai yra lėtas ir beprasmis. Vietoj to naudokite ST_DWithin.


Žiūrėti video įrašą: BUFFER in Postgis STBuffer