Example #1
0
 $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()) {
     $ip = (int) $row[0];
Example #2
0
/**
 * Get clusters for the specified tiles.
 * 
 * @param object $db Object which represents the connection to a MySQL Server.
 * @param int $tile_x1 X coordinate of the upper left tile.
 * @param int $tile_y1 Y coordinate of the upper left tile.
 * @param int $tile_x2 X coordinate of the bottom right tile
 * @param int $tile_y2 Y coordinate of the bottom right tile
 * @param int $zoom Level of detail
 * @param bool $scatter Don't clusterize on large zoom
 * @return array Rerutn array of clusters: [quadkey => cluster], where cluster
 * is array ['count' => (int), 'lat' => (float), 'lon' => (float)/, bssids => []/]
 */
function get_clusters($db, $tile_x1, $tile_y1, $tile_x2, $tile_y2, $zoom, $scatter)
{
    $quadkeys = get_quadkeys_for_tiles($tile_x1, $tile_y1, $tile_x2, $tile_y2, $zoom);
    $clusters = array();
    if ($scatter && $zoom >= MAX_YANDEX_ZOOM - 1) {
        $group_level = MAX_ZOOM_LEVEL;
        $fetch_all = true;
    } else {
        $group_level = $zoom + 2;
        $fetch_all = $zoom >= MAX_YANDEX_ZOOM;
    }
    foreach ($quadkeys as $quadkey) {
        $clusters += find_clusters_on_quadkey($db, $quadkey, $group_level, $fetch_all);
    }
    return $clusters;
}