You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
158 lines
4.4 KiB
PHP
158 lines
4.4 KiB
PHP
<?php
|
|
|
|
/*
|
|
* To change this license header, choose License Headers in Project Properties.
|
|
* To change this template file, choose Tools | Templates
|
|
* and open the template in the editor.
|
|
*/
|
|
|
|
function parse_citystatezip($citystatezip) {
|
|
$citystatezip = strtoupper(trim($citystatezip));
|
|
|
|
$fullregex = "/^(.+), ?(.+)[,| |, ]([0-9]{5})(-[0-9]{4})?$/";
|
|
$citystateregex = "/^(\w+)[,\s]+([A-Z]{2,})+$/";
|
|
|
|
if (!preg_match($fullregex, $citystatezip, $matches)) {
|
|
if (!preg_match($citystateregex, $citystatezip, $matches)) {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
return [
|
|
"city" => $matches[1],
|
|
"state" => $matches[2],
|
|
"zip" => isset($matches[3]) ? $matches[3] : null
|
|
];
|
|
}
|
|
|
|
function parse_citystate($citystate) {
|
|
$citystate = strtoupper(trim($citystate));
|
|
|
|
$regex = "/^(\w+)[,\s]+([A-Z]{2,})+$/";
|
|
|
|
if (!preg_match($regex, $citystate, $matches)) {
|
|
return null;
|
|
}
|
|
|
|
return [
|
|
"city" => $matches[1],
|
|
"state" => $matches[2]
|
|
];
|
|
}
|
|
|
|
function geocode_returnresult($query) {
|
|
global $SETTINGS, $database;
|
|
|
|
$geocoder = new \Geocoder\ProviderAggregator();
|
|
$adapter = new \Http\Adapter\Guzzle6\Client();
|
|
|
|
$chain = new \Geocoder\Provider\Chain\Chain([
|
|
new \Geocoder\Provider\LocalDatabase\LocalDatabase($database),
|
|
new \Geocoder\Provider\Mapbox\Mapbox($adapter, $SETTINGS["mapbox_key"]),
|
|
new \Geocoder\Provider\MapQuest\MapQuest($adapter, $SETTINGS["mapquest_key"])
|
|
]);
|
|
|
|
$geocoder->registerProvider($chain);
|
|
|
|
$results = $geocoder->geocodeQuery($query);
|
|
|
|
|
|
if ($results->count() > 0) {
|
|
$result = $results->first();
|
|
} else {
|
|
header("Content-Type: application/json");
|
|
return [
|
|
"status" => "ERROR",
|
|
"message" => "That address doesn't seem to exist. If this is an error, please send the full address (including city, state, and ZIP) to support@netsyms.com.",
|
|
"address" => [
|
|
"street" => "",
|
|
"postalCode" => ""
|
|
],
|
|
"coords" => [
|
|
0,
|
|
0
|
|
],
|
|
"accuracy" => [
|
|
"ok" => false
|
|
],
|
|
"provider" => ""
|
|
];
|
|
}
|
|
|
|
$geolatitude = $result->getCoordinates()->getLatitude();
|
|
$geolongitude = $result->getCoordinates()->getLongitude();
|
|
|
|
$accurate = !empty($result->getStreetNumber());
|
|
|
|
if ($accurate) {
|
|
$address = implode(" ", [$result->getStreetNumber(), $result->getStreetName()]);
|
|
} else {
|
|
$address = $result->getStreetName();
|
|
}
|
|
|
|
|
|
return [
|
|
"status" => "OK",
|
|
"address" => [
|
|
"street" => ucwords(strtolower(StreetNormalizer::normalizeAddress($address))),
|
|
"postalCode" => $result->getPostalCode()
|
|
],
|
|
"coords" => [
|
|
$geolatitude,
|
|
$geolongitude
|
|
],
|
|
"accuracy" => [
|
|
"ok" => $accurate
|
|
],
|
|
"provider" => $result->getProvidedBy()
|
|
];
|
|
}
|
|
|
|
function geocode_addrstring($address) {
|
|
$query = Geocoder\Query\GeocodeQuery::create($address)->withLimit(1);
|
|
return geocode_returnresult($query);
|
|
}
|
|
|
|
/**
|
|
* Geocode an address.
|
|
* @global type $SETTINGS
|
|
* @param type $number
|
|
* @param type $street
|
|
* @param type $unit
|
|
* @param type $city
|
|
* @param type $state
|
|
* @param type $zip
|
|
* @param type $country
|
|
* @param type $type
|
|
* @return type
|
|
*/
|
|
function geocode($number, $street, $unit = null, $city, $state, $zip = null, $country = null, $type = null) {
|
|
$address = "$number $street $city $state";
|
|
$origaddress = "$number $street";
|
|
|
|
$query = Geocoder\Query\GeocodeQuery::create($address)
|
|
->withLimit(1)
|
|
->withData("number", $number)
|
|
->withData("street", $street)
|
|
->withData("city", $city)
|
|
->withData("state", $state);
|
|
if (!is_null($zip) && preg_match("/^([0-9]{5})/", $zip, $matches)) {
|
|
if (count($matches) > 0) {
|
|
$query = $query->withData("zip", $matches[0]);
|
|
}
|
|
}
|
|
if (!is_null($unit) && !empty($unit)) {
|
|
$query = $query->withData("unit", $unit);
|
|
}
|
|
|
|
if (!is_null($type) && count(array_diff(explode("|", $type), $SETTINGS["address_types"])) == 0) {
|
|
$query = $query->withData("locationtype", $type);
|
|
}
|
|
|
|
if (!is_null($country) && preg_match("/^[A-Z]{2}$/", $country)) {
|
|
$query = $query->withData("country", $country);
|
|
}
|
|
|
|
return geocode_returnresult($query);
|
|
}
|