} $radius = (double) $radius; if ($radius < 0 || $radius > 25) { $json['error'] = 'Значение радиуса поиска должно лежать в диапазоне (0;25]'; break; } $lat_km = 111.143 - 0.5620000000000001 * cos(2 * deg2rad($lat)); $lon_km = abs(111.321 * cos(deg2rad($lon)) - 0.094 * cos(3 * deg2rad($lon))); $lat1 = min(max($lat - $radius / $lat_km, -90), 90); $lat2 = min(max($lat + $radius / $lat_km, -90), 90); $lon1 = min(max($lon - $radius / $lon_km, -180), 180); $lon2 = min(max($lon + $radius / $lon_km, -180), 180); $tile_x1 = lon_to_tile_x($lon1, 7); $tile_y1 = lat_to_tile_y($lat2, 7); $tile_x2 = lon_to_tile_x($lon2, 7); $tile_y2 = lat_to_tile_y($lat1, 7); $quadkeys = get_quadkeys_for_tiles($tile_x1, $tile_y1, $tile_x2, $tile_y2, 7); $quadkeys = '(' . implode(',', array_map(function ($x) { return base_convert($x, 2, 10); }, $quadkeys)) . ')'; $json['data'] = array(); if (!db_connect()) { $json['result'] = false; $json['error'] = 'database'; break; } if ($res = QuerySql("SELECT DISTINCT IP FROM \n\t\t(SELECT IP \n\t\tFROM `BASE_TABLE`, `GEO_TABLE` \n\t\tWHERE (`GEO_TABLE`.`quadkey` >> 32) IN {$quadkeys} AND\n\t\t\t\t`BASE_TABLE`.`BSSID` = `GEO_TABLE`.`BSSID` \n\t\t\t\tAND (`GEO_TABLE`.`quadkey` IS NOT NULL) \n\t\t\t\tAND (`GEO_TABLE`.`latitude` BETWEEN {$lat1} AND {$lat2} AND `GEO_TABLE`.`longitude` BETWEEN {$lon1} AND {$lon2}) \n\t\t\t\tAND (IP != 0 AND IP != -1) \n\t\tUNION SELECT WANIP \n\t\tFROM `BASE_TABLE`, `GEO_TABLE` \n\t\tWHERE (`GEO_TABLE`.`quadkey` >> 32) IN {$quadkeys} AND\n\t\t\t\t`BASE_TABLE`.`BSSID` = `GEO_TABLE`.`BSSID` \n\t\t\t\tAND (`GEO_TABLE`.`quadkey` IS NOT NULL) \n\t\t\t\tAND (`GEO_TABLE`.`latitude` BETWEEN {$lat1} AND {$lat2} AND `GEO_TABLE`.`longitude` BETWEEN {$lon1} AND {$lon2}) \n\t\t\t\tAND (WANIP != 0 AND WANIP != -1)\n\t\t) IPTable ORDER BY CAST(IP AS UNSIGNED INTEGER)")) { } require 'ipext.php'; $last_upper = 0; while ($row = $res->fetch_row()) {
/** * Converts a point from latitude/longitude WGS-84 coordinates (in degrees) * into a QuadKey at a specified level of zoom (using elliptic Mercator * projection). * * @param float $latitude Latitude of the point, in degrees. * @param float $longitude Longitude of the point, in degrees. * @param int $zoom Level of detail, from 0 (the whole map as single tile) * to 23 (highest detail). * @return string A string containing the QuadKey in binary form. */ function latlon_to_quadkey($latitude, $longitude, $zoom) { if ($zoom == 0) { return 0; } $tile_x = lon_to_tile_x($longitude, $zoom); $tile_y = lat_to_tile_y($latitude, $zoom); return tile_to_quadkey($tile_x, $tile_y, $zoom); }