melder/lib/geocoding.php
Walter Hupfeld 46ad703473 districts
2024-02-18 13:37:18 +01:00

126 lines
4.0 KiB
PHP

<?php
/** -----------------------------------------------------
* function getAdress($lat,$lng)
* Reverse geocoding of address by using locationiq.com
* Input: lat and lng of location
* Returns: data-array
* ----------------------------------------------------- */
require("../config.db.php");
function getAddress($lat,$lng) {
global $location_key;
$key = $location_key;
$url = "https://us1.locationiq.com/v1/reverse.php?key=".$key."&lat=".$lat."&lon=".$lng."&format=json";
$curl = curl_init($url);
curl_setopt_array($curl, array(
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_CUSTOMREQUEST => 'GET',
));
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
$arrData = array();
if ($err) {
return false; //"cURL Error #:" . $err;
} else {
$data = json_decode($response);
foreach ($data as $key=>$value) {
if ($key=="address") {
foreach ($value as $k=>$v) {
//echo $k." ".$v."<br>";
$arrData[$k]=$v;
}
}
};
return $arrData;
}
}
/** ----------------------------------------------
* function writeAddress
* Write data to database
* $db - database handel
* $id - id of location
* $data - address data of location
* location - address schould be an 1:1-relation
* ----------------------------------------------- */
function writeAddress($db,$id,$data) {
$arrKeys = array ('parking','road','house_number','industrial','neighbourhood','hamlet','suburb','postcode','city','county','country');
$strSQL="insert into address (loc_id,parking,road,house_number,industrial,";
$strSQL.="neighbourhood,hamlet,suburb,postcode,city,county,country) values ($id";
foreach ($arrKeys as $key) {
$strSQL .= (isset($data[$key])) ? ",'".$data[$key]."'" : ",''";
}
$strSQL.=")";
$db->exec($strSQL);
}
/**
* function fillAddressTable($db,$limit)
* $db - database handel
* $limit - only look for these count of entries because of api restriction
*/
function fillAddressTable($db,$limit=20) {
$arrIds = array();
// Get all ids from address table and write to array
$strSQL="select loc_id from address";
$result=$db->query($strSQL);
while ($row=$result->fetch(PDO::FETCH_ASSOC)) {
$arrIds[]=$row['loc_id'];
}
$counter=0;
$strSQL="SELECT id,lat,lng FROM location";
$arrKeys = array ('parking','road','house_number','industrial','neighbourhood','hamlet','suburb','postcode','city','county','country');
$result=$db->query($strSQL);
$strTable = "<table class='table table-bordered table-striped'>";
$strTable .= "<tr><th>id</th><th>lat</th><th>lng</th>";
foreach ($arrKeys as $key) {
$strTable .= "<th>".$key."</th>";
}
$strTable .= "</tr>";
while ($row=$result->fetch(PDO::FETCH_ASSOC)) {
$id=$row['id'];
if (!in_array($id,$arrIds) && $counter<$limit) {
$counter++;
$lat=$row['lat'];
$lng=$row['lng'];
$data=getAddress($lat,$lng);
$strTable .= "<tr><td>$id</td><td>$lat</td><td>$lng</td>";
foreach ($arrKeys as $key) {
$strTable .= (isset($data[$key])) ? "<td>".$data[$key]."</td>" : "<td></td>";
}
$strTable .= "</tr>";
sleep(0.5); //api restriction
writeAddress($db,$id,$data);
}
}
$strTable .= "<table>";
return ($counter>0) ? $strTable : "Keine neuen Adressdaten.";
}
function cleanAddresses($db){
$strSQL="DELETE FROM address WHERE parking='' and road='' and house_number=''
and industrial='' and neighbourhood='' and hamlet=''
and suburb='' and postcode='' and city='' and county=''";
$db->query($strSQL);
}
// echo fillAddressTable($db,10);