Latitud och longitud i PHP: Några användbara metoder
I tidigare inlägg skrev jag en bra bit om att arbeta med Google Maps API. Ärligt talat har jag inte jobbat med det sedan det inlägget.
Jag har dock varit tvungen att arbeta med latitud och longitud i PHP, och det finns några metoder som jag har börjat använda som jag tror kan tjäna oss väl när vi arbetar med koordinater eller flyttalsvärden i allmänhet.
I följande kodbit kommer jag att bryta ner tillvägagångssättet jag har använt och varför jag har gjort det. Men jag vill vara tydlig med att om du läser detta i förhållande till Google Maps API, så finns det inte mycket jag kan erbjuda i vägen för hur detta fungerar och den nuvarande versionen av deras API.
Latitud och Longitud i PHP
Närhelst du arbetar med latitud och longitud i PHP, arbetar du med flyttalsvärden, eller hur? Så du vill aldrig analysera dem till något mindre än så; annars förlorar du data och du kommer inte att kunna hitta vad det än är du försöker hitta.
Så för all del, låt oss anta att du har information som kommer in i servern och att du måste arbeta med den med PHP.
De två saker du vill komma ihåg är:
- sanera inkommande data,
- se till att det omvandlas till ett flyttal.
Detta kan göras genom att använda PHP:s filter_var och floatval -funktioner som jag kommer att prata om ett ögonblick. Observera dock att om resultatet av floatval inte returnerar en flyttal, måste du ha ett graciöst sätt att hantera det.
Enligt manualen kan floatval returnera följande:
Flytvärdet för den givna variabeln. Tomma arrayer returnerar 0, icke-tomma arrayer returnerar 1. Strängar kommer med största sannolikhet att returnera 0 även om detta beror på tecknen längst till vänster i strängen. De vanliga reglerna för flytgjutning gäller.
Vi ska titta på hur vi hanterar detta mer graciöst senare i inlägget.
Analysera inkommande latitud och longitud
Låt oss anta att de inkommande värdena finns i PHP:s $_REQUEST- samling (som hänvisar till HTTP-förfrågningar som kommer in till servern) inskrivna som acme-demo-latitude och acme-demo-longitude.
Vi kan hämta dem så här :
<?php
$latitude = $_REQUEST['acme-demo-latitude'];
$longitude = $_REQUEST['acme-demo-longitude'];
Men det här räcker inte. Först måste vi använda filter_var för att se till att data är sanerade och följer flyttalsschemat :
<?php
$latitude = filter_var(
$_REQUEST['acme-demo-latitude'],
FILTER_SANITIZE_NUMBER_FLOAT
);
$longitude = filter_var(
$_REQUEST['acme-demo-longitude'],
FILTER_SANITIZE_NUMBER_FLOAT
);
Därefter tycker jag att det är användbart att använda floatval för att analysera resultatet som ett flyttalvärde. Detta gör att följande kodblock ser ut så här :
<?php
$latitude = floatval(
filter_var(
$_REQUEST['acme-demo-latitude'],
FILTER_SANITIZE_NUMBER_FLOAT) );
$longitude = floatval(
filter_var(
$_REQUEST['acme-demo-latitude'],
FILTER_SANITIZE_NUMBER_FLOAT) );
Därefter är du fri att använda den. Men kom ihåg att vi fortfarande måste se till att värdena som returneras är flyttalsvärden.
Validera data
Nu när vi har informationen måste vi se till att det ser bra ut. Och om det inte gör det måste vi hantera det på rätt sätt. Om det inte är det kan vi helt enkelt:
- returnera false från funktionen som den innehåller,
- kasta ett undantag och låt den som ringer hantera det som den vill.
Vart och ett av dessa exempel kan se ut så här :
<?php
// Return false...
if (! (is_float( $latitude) && is_float( $longitude) )) {
return false;
}
// Or throw an exception...
if (! (is_float( $latitude) && is_float( $longitude) )) {
throw new Exception('Latitude and longitude are not valid floating point values.');
}
Men i slutändan är beslutet ditt om hur du ska hantera värdena när de inte är i rätt format när du analyserar dem.
Är dessa bästa praxis?
För att vara ärlig tvivlar jag på det. Jag vet att det här är de saker jag har använt och som jag har funnit användbara. Det ger också ett defensivt, motståndskraftigt sätt att se till att dina värderingar är korrekta.
Men om det finns bättre sätt att göra detta så är jag öppen för att höra dem i kommentarerna.