$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];