sql >> Database teknologi >  >> RDS >> PostgreSQL

postgresql postgis Hvis punkt inde i cirkel

For det første - jeg antager, at lat_long er kolonne af georafitype. Hvis det er kolonne af geometritype, bliver du nødt til at ændre mine eksempler til en anden EPSG (formentlig 3857 metrisk EPSG for hele verden). Det er meget vigtigt, fordi st_dwithin tjekker ind meter for geoprafi type og i kortenheder for geometri (og for EPSG 4326 er enheden grad ikke meter)

Indsæt dine data på denne måde

insert into car_wash values (1,'aaa',st_setsrid(st_makepoint(54.51, 22.54),4326))

Jeg forklarer hvorfor man bruger st_setsrid, st_makepoint, og hvad fanden er 4326.- 4326 er EPSG 4326 - det er det mest kendte koordinatreferencesystem (hvor man har lat og long i grader).

  • st_makepoint - vil oprette geografipunkt fra dine lat- og lange koordinater. Det vil ligne bytes, men bare rolig, hvis du har brug for lat og lang af nogle grunde, kan du få dem med st_x() og st_y() eller st_astext() funktioner. Det bedste ved at have geoms eller geogs (i dette tilfælde) er, at du kan bruge det reelle indeks. Meget kraftfuldt værktøj, der fremskynder dine geo-forespørgsler.

  • st_setsrid - st_makepoint vil oprette punkt men med srid=0. Du skal fortælle POSTGIS i hvilken EPSG den skal læse dine data. For eksempel hvis du fortæller ham at læse det med 4326, vil det være de rigtige steder på google verdenskort, men hvis du for eksempel siger 3857, vil det være et helt andet sted, da 3857 er metrisk system ikke grad, så det vil være omkring 50 og 50 meter fra venstre nede hjørne (eller måske venstre op, husk det ikke)

Opret indeks på geog

create index on car_wash using gist (geog);

Vi har tabel, vi har data i det og indeks på det. Nu vil vi tjekke, om dit punkt er tæt på nogen af ​​dine bilvaskeanlæg.

select *
  from car_wash cw
 where ST_DWithin (cw.geog,ST_GeogFromtext('SRID=4326;POINT(54.21 22.54)'),1000)
  AND cw.was_deleted=false

I ST_DInden for tredje parametre er afstand i meter (georpahy) eller kortenheder (geometri). Så i dette tilfælde vil den vise dig alle vaskehaller, der er op til 1000 meter fra din brugerplacering og ikke slettes.



  1. Forespørg efter PostgreSQL med Npgsql og Entity Framework ved hjælp af unaccent

  2. Opret forbindelse til en ekstern MySQL-database ved hjælp af Android

  3. Henter/lagrer alle relaterede skuespillere i Freebase

  4. Kan en underforespørgsel bruges i en Oracle ALTER-sætning?