Beispiel #1
0
         $query = '[out:json][timeout:6]; ( node["amenity"="place_of_worship"](around:' . $around2 . ',' . $lat . ',' . $lon . '); way["amenity"="place_of_worship"](around:' . $around2 . ',' . $lat . ',' . $lon . '); rel["amenity"="place_of_worship"](around:' . $around2 . ',' . $lat . ',' . $lon . '); ); out body center qt 6;';
         $obj = getOverpass($query);
         if (count((array) $obj->elements) > 5) {
             $query = '[out:json][timeout:6]; ( node["amenity"="place_of_worship"](around:' . $around . ',' . $lat . ',' . $lon . '); way["amenity"="place_of_worship"](around:' . $around . ',' . $lat . ',' . $lon . '); rel["amenity"="place_of_worship"](around:' . $around . ',' . $lat . ',' . $lon . '); ); out body center qt;';
             $obj = getOverpass($query);
         }
         $k = false;
         $dmisn = $around2 + 1;
         foreach ($obj->elements as $key => $element) {
             if (isset($element->center->lat)) {
                 $element->lat = $element->center->lat;
             }
             if (isset($element->center->lon)) {
                 $element->lon = $element->center->lon;
             }
             $d = Distance($church, (array) $element);
             if ((int) $d < (int) $dmisn) {
                 $k = $key;
                 $dmisn = $d;
             }
             $obj->elements[$key]->distance = $d;
         }
         $osmelements = json_decode(json_encode($obj->elements), true);
         if ($dmisn <= 60) {
             $osm = json_decode(json_encode($obj->elements[$k]), true);
         }
     }
 }
 $e = array('node' => 'n', 'way' => 'w', 'relation' => 'r');
 if (!$church['osm'] and is_array($osm) and $osm['tags']['url:miserend'] != 'http://miserend.hu/?templom=' . $church['id']) {
     $context = 'warning';
function updateDistances($tid = false, $limit = false)
{
    global $config;
    if (!is_numeric($limit) or $limit == false) {
        $limit = 120;
    }
    $query = "\n        SELECT count(*) as sum FROM templomok \n            LEFT JOIN terkep_geocode as geo ON geo.tid = id\n        WHERE ok = 'i' \n            AND geo.lat <> '' AND geo.lng <> ''\n    ";
    $result = mysql_query($query);
    $sum = mysql_fetch_assoc($result);
    $sum = $sum['sum'];
    $query = "\n        SELECT id,geo.lat,geo.lng FROM templomok  \n            LEFT JOIN terkep_geocode as geo ON geo.tid = templomok.id \n            WHERE geo.lat <> '' AND geo.lng <> '' \n    ";
    if ($tid != false) {
        $query .= "AND id = " . $tid . " ";
    }
    $query .= "  ORDER BY moddatum DESC ";
    if ($tid != false) {
        $query .= " LIMIT 1;";
    }
    $result = mysql_query($query);
    $c = 0;
    while ($church = mysql_fetch_assoc($result)) {
        set_time_limit('600');
        // we'll want everything within, say, 10km distance
        $distance = 10;
        // earth's radius in km = ~6371
        $radius = 6371;
        // latitude boundaries
        $maxlat = $church['lat'] + rad2deg($distance / $radius);
        $minlat = $church['lat'] - rad2deg($distance / $radius);
        // longitude boundaries (longitude gets smaller when latitude increases)
        $maxlng = $church['lng'] + rad2deg($distance / $radius / cos(deg2rad($church['lat'])));
        $minlng = $church['lng'] - rad2deg($distance / $radius / cos(deg2rad($church['lat'])));
        $query = "\n            SELECT t.id,geo.lat,geo.lng,(ABS(geo.lat - " . $church['lat'] . ") + ABS(geo.lng - " . $church['lng'] . ")) diff,(IFNULL(d1.up,0) + IFNULL(d2.up,0)) toupdate\n            FROM templomok AS t\n                LEFT JOIN terkep_geocode as geo ON geo.tid = t.id \n                LEFT JOIN ( SELECT tid1,distance,toupdate as up FROM distance WHERE tid2 = " . $church['id'] . " ) AS d1 ON d1.tid1 = t.id\n                LEFT JOIN ( SELECT tid2,distance,toupdate as up FROM distance WHERE tid1 = " . $church['id'] . " ) AS d2 ON d2.tid2 = t.id\n                WHERE geo.lng <> '' AND geo.lat <> ''\n                    AND t.ok = 'i'\n                    AND ( tid1 IS NULL OR d1.up IS NOT NULL ) AND ( tid2 IS NULL OR d2.up IS NOT NULL) \n                    AND id <> " . $church['id'] . "\n                    AND ( \n                        ( lat BETWEEN " . $minlat . " AND " . $maxlat . " AND lng BETWEEN " . $minlng . " AND " . $maxlng . " ) \n                         OR d1.up IS NOT NULL  OR d2.up IS NOT NULL \n                        ) \n            ORDER by diff, t.id ";
        if ($tid == false) {
            $query .= ' LIMIT 15';
        } else {
            $query .= " LIMIT " . $limit;
        }
        $result2 = mysql_query($query);
        while ($other = mysql_fetch_assoc($result2)) {
            $c++;
            if ($c > $limit) {
                return;
            }
            if ($other['id'] < $church['id']) {
                $tid1 = $other['id'];
                $tid2 = $church['id'];
            } else {
                $tid1 = $church['id'];
                $tid2 = $other['id'];
            }
            $d = Distance($church, $other);
            if ($d < $distance * 1000 and $d > 0) {
                $dist = mapquestDistance($church, $other);
                if ($dist == -2) {
                    return;
                } elseif ($dist > 0) {
                    $d = $dist;
                }
            }
            if ($other['toupdate'] == 0) {
                $query = "INSERT INTO distance (tid1,tid2,distance,updated,toupdate) VALUES (" . $tid1 . "," . $tid2 . ",'" . $d . "','" . date('Y-m-d H:i:s') . "',NULL);";
            } else {
                $query = "UPDATE distance SET distance = '" . $d . "', updated = '" . date('Y-m-d H:i:s') . "', toupdate = NULL WHERE tid1 = " . $tid1 . " AND tid2 = " . $tid2 . " LIMIT 1";
            }
            mysql_query($query);
            //echo $query."<br/>";
        }
        if ($c == $limit) {
            return;
        }
    }
}
    return $number;
}
fscanf(STDIN, "%s", $LON);
//Превращаем градусы в радианы
$LON = FloatRadStyle($LON);
fscanf(STDIN, "%s", $LAT);
$LAT = FloatRadStyle($LAT);
fscanf(STDIN, "%d", $N);
//Считываем данные в двумерный массив
$defibrillators = [];
for ($i = 0; $i < $N; $i++) {
    $DEFIB = stream_get_line(STDIN, 256, "\n");
    list($num, $name, $address, $phone, $lonB, $latB) = explode(";", $DEFIB);
    $lonB = FloatRadStyle($lonB);
    $latB = FloatRadStyle($latB);
    $defibrillators[$i] = array($name, $lonB, $latB);
}
// Write an action using echo(). DON'T FORGET THE TRAILING \n
// To debug (equivalent to var_dump): error_log(var_export($var, true));
//Ищем минимальную дистанцию
$minDist = pow(2, 32);
$choice = 0;
for ($i = 0; $i < $N; $i++) {
    $dist = Distance($LON, $LAT, $defibrillators[$i][1], $defibrillators[$i][2]);
    if ($dist < $minDist) {
        $minDist = $dist;
        $choice = $i;
    }
}
//Вывод ответа
echo $defibrillators[$choice][0];