Hierdie maand het ek nogal in PHP en MySQL geprogrammeer met betrekking tot GIS. Terwyl ek op die internet gesleep het, het ek eintlik 'n paar geografiese berekeninge gevind om die afstand tussen twee plekke te vind, en ek wou dit hier deel.
Die eenvoudige manier om 'n afstand tussen twee punte te bereken, is deur die Pythagorese formule te gebruik om die skuinssy van 'n driehoek te bereken (A² + B² = C²). Dit staan ​​bekend as die Euklidiese afstand.
Die afstand met behulp van die kromming van die Aarde is opgeneem in die Haversine formule, wat trigonometrie gebruik om die kromming van die aarde moontlik te maak. As u die afstand tussen twee plekke op aarde vind (soos die kraai vlieg), is 'n reguit lyn 'n boog.
Ek het hierdie kode gebruik in 'n kaarteplatform vir ondernemings wat ons gebruik het vir 'n kleinhandelwinkel met meer as 1,000 XNUMX plekke in Noord-Amerika, en dit het pragtig gewerk.
Baie dankie vir die deel. Dit was 'n maklike kopieer- en plakwerk en werk uitstekend. U het my baie tyd bespaar.
Baie mooi boodskap - baie goed gewerk - ek moes net die naam van die tafel verander wat die lengte bevat. Dit werk redelik vinnig tot .. Ek het 'n redelike klein aantal lang lengtes (<400), maar ek dink dit sal mooi afskaal. Mooi webwerf ook - ek het dit pas by my del.icio.us-rekening gevoeg en sal gereeld terugkom.
Ek het die hele dag na afstandberekeninge gesoek en die harversine-algoritme gevind, dankie aan u dat u die voorbeeld gegee het oor hoe om dit in 'n SQL-verklaring te plaas. Dankie en groet, Daniel
Nou is ek op soek na 'n 'in veelhoek'-PHP-funksie wat 'n reeks koordinate vir lengte- en breedtegraad opeenvolg en neem of daar 'n ander punt binne of buite die veelhoek is.
Baie dankie vir die deel van hierdie kode. Dit het my baie ontwikkelingstyd bespaar. Dank u ook aan u lesers wat daarop gewys het dat 'n HAVING-verklaring nodig is vir MySQL 5.x. Baie behulpsaam.
Baie dankie mouch vir die script wat in mysql geskryf is, moes net 'n paar klein aanpassings maak (HAVING) 🙂
Wat ons hiermee bereik, is 'n beduidende afname in die aantal punte waarteen u hierdie berekening maak. As u 'n miljoen globale punte in die databasis het wat ongeveer eweredig versprei is en u binne 100 km wil soek, dan is u eerste (vinnige) soektog 'n oppervlakte van 10000 vierkante km en sal dit waarskynlik ongeveer 20 resultate lewer (gebaseer op eweredige oppervlakte van ongeveer 500 M vierkante km), wat beteken dat u die komplekse afstandberekening 20 keer vir hierdie navraag in plaas van 'n miljoen keer uitvoer.
Fantastiese raad! Ek het eintlik saam met 'n ontwikkelaar gewerk wat 'n funksie geskryf het wat die binnekant van die vierkant getrek het en dan 'n rekursiewe funksie wat 'vierkante' rondom die omtrek gemaak het om die oorblywende punte in te sluit en uit te sluit. Die resultaat was 'n ongelooflike vinnige resultaat - hy kon miljoene punte in mikrosekondes evalueer.
Dit is wonderlik, maar dit is net soos die voëls vlieg. Dit sal wonderlik wees om die Google Maps API op die een of ander manier hierby in te werk (miskien met behulp van paaie, ens.) Net om 'n idee te gee met 'n ander vorm van vervoer. Ek moet nog 'n gesimuleerde uitgloeiingsfunksie in PHP maak wat 'n doeltreffende oplossing vir die reisverkoperprobleem kan bied. Maar ek dink dat ek dalk van u kode kan hergebruik om dit te doen.
Baie dankie vir hierdie formule. Dit het 'n geruime tyd geskeer op 'n winkelprojek wat my aangevreet het.
Dankie Georgi. Ek het steeds kolom 'afstand' gekry. Sodra ek die WAAR na HAVE verander, werk dit soos 'n bekoring!
Ek wens dit was die eerste bladsy wat ek hieroor gevind het. Nadat ek baie verskillende opdragte probeer het, was dit die enigste wat behoorlik werk, en met die minimum veranderinge wat nodig was om in my eie databasis te pas.
Ek weet dat hierdie formule werk, maar ek kan nie sien waar die radius van die aarde in ag geneem word nie. Kan iemand my asseblief verlig?
Peter, lees asseblief die ander kommentaar. Dit blyk dat sommige mense 'n ander sintaksis moes gebruik vir WHERE / HAVING.
Haai Douglas, wonderlike artikel. Ek het u verduideliking van die geografiese begrippe en die kode regtig interessant gevind. My enigste voorstel is om die kode vir vertoon (soos byvoorbeeld Stackoverflow) te spasieer en in te trek. Ek verstaan ​​dat u ruimte wil bespaar, maar konvensionele kodespasiëring / inkeping sou dit vir my as programmeerder baie makliker maak om te lees en te dissekteer. Dit is in elk geval 'n klein dingetjie. Hou aan met die wonderlike werk.
Dankie! Ek het die berig 'n bietjie verander ... maar die vergelykings neem soveel ruimte in en is so lank dat ek nie seker is dat dit te veel help nie.
PHP is 'n oop bron-bediener-taal wat gebruik word vir die skep van dinamiese webblaaie. Dit kan in HTML ingebed word. PHP word gewoonlik saam met 'n MySQL-databasis op Linux / UNIX-webbedieners gebruik. Dit is waarskynlik die gewildste skriptaal.