sql >> Database teknologi >  >> RDS >> Mysql

Forespørg databaseværdier baseret på brugerens placering

Der er et spørgsmål, der sammenligner mulighederne i forskellige rumlige databaser, GIS:PostGIS/PostgreSQL vs. MySql vs. SQL Server? , hvor Postgis kommer ud som en ret klar vinder over MySQL.

Uanset om du bruger MySQL eller Postgis, ville du være meget bedre stillet, hvis du kan, gemme dine bredde- og længdegradsværdier som en geometri/geografi (punkt), som de funktioner, der kan bruges til at finde ting i nærheden, ST_Distance , ST_Distance_Sphere og den mere obskure , se Find n nærmeste naboer for givet point ved hjælp af PostGIS? (for eksempel brug) arbejde direkte på geometri/geografi kolonner. Endnu vigtigere er det, at du kan tilføje et rumligt indeks , som disse funktioner har brug for for at fungere korrekt, hvilket vil overgå søgninger på separat indekserede bredde- og længdegradskolonner med en stor margen (dette afhænger af tabelstørrelsen, men vil vokse, efterhånden som tabelstørrelsen vokser),

I Postgis kan du konvertere lat og lon til en geometri med:

alter table mytable add column geom (Geometry, 4326);
update mytable set geom = ST_SetSRID(ST_MakePoint(lon, lat), 4326)
create index ix_spatial_mytable_geom on mytable using gist(geom);

På dette tidspunkt vil du være i stand til meget effektive forespørgsler for at finde punkter i nærheden af ​​andre punkter ved at bruge et af eksemplerne i ovenstående links.

Du kan gøre lignende ting i MySQL, selvom det ikke understøtter et rumligt referencesystem, dvs. 4326 ovenfor, hvilket betyder lat/lon, og det mangler en ST_MakePoint-funktion, så du bliver nødt til at bruge STGeomFromText og sammenkæde lat/ lon sammen for at lave et PUNKT. Den gør også alt i plane koordinater, som Claudio og andre har sagt, hvilket ikke er et problem med Postgis.

Jeg undskylder for et langt og noget tangentielt svar, men efter at have lavet forskellige migreringer mellem databaser på store mængder data (MySQL, SQL Server og Postgres/GIS) og lavet en masse fejl undervejs, håber jeg, at jeg kan sætte dig i gang i rigtige retning (og tilføj lidt fremtidssikring, hvis du vil begynde at bruge en anden rumlig funktionalitet, som Postigs har i spar).



  1. MySQL sorterer efter antal forekomster

  2. Få topscorer(e) i MySQL

  3. MySQL kommandolinjeformatering med UTF8

  4. PHP MYSQL INSERT hjælper ingen fejl