карты Google, CellID для местоположения

По этому образцу:

http://www.codeproject.com/KB/mobile/DeepCast.aspx

Можно запросить GPS-координату (долготу и широту), включая диапазон, при отправке информации о CellID (MCC, MNC, TowerID и т. д.)

Может ли кто-нибудь сказать мне фактический параметр для запроса/отправки по этому адресу?

http://www.google.com/glm/mmap

Это может быть что-то вроде этого

http://www.google.com/glm/mmap?mcc=xxx&mnc=xxx&towerid=xxx

И я хотел бы знать, какой ответ мы получим.

Я наблюдаю за веб-сайтом OpenCellid, и для начала они предоставляют хороший API, но я хочу знать об этом и на карте Google (поскольку у них более полная база данных).

API OpenCellID


person Dels    schedule 21.10.2009    source источник
comment
Я не уверен. Но с Google Maps кажется, что всякий раз, когда у моего места есть новый Cell ID, через несколько недель или месяцев Google Maps обновляет этот Cell ID.   -  person    schedule 03.03.2012


Ответы (5)


Вот пример для работы с

#!/usr/bin/python

country = 'fr'
#device = 'Sony_Ericsson-K750'
device = "Nokia N95 8Gb"
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
mmap_url = 'http://www.google.com/glm/mmap'
geo_url = 'http://maps.google.com/maps/geo'

from struct import pack, unpack
from httplib import HTTP
import urllib2

def fetch_latlong_http(query):
    http = HTTP('www.google.com', 80)
    http.putrequest('POST', '/glm/mmap')
    http.putheader('Content-Type', 'application/binary')
    http.putheader('Content-Length', str(len(query)))
    http.endheaders()
    http.send(query)
    code, msg, headers = http.getreply()
    result = http.file.read()
    return result

def fetch_latlong_urllib(query):
    headers = { 'User-Agent' : user_agent }
    req = urllib2.Request(mmap_url, query, headers)
    resp = urllib2.urlopen(req)
    response = resp.read()
    return response

fetch_latlong = fetch_latlong_http

def get_location_by_cell(cid, lac, mnc=0, mcc=0, country='fr'):
    b_string = pack('>hqh2sh13sh5sh3sBiiihiiiiii',
                    21, 0,
                    len(country), country,
                    len(device), device,
                    len('1.3.1'), "1.3.1",
                    len('Web'), "Web",
                    27, 0, 0,
                    3, 0, cid, lac,
                    0, 0, 0, 0)

    bytes = fetch_latlong(b_string)
    (a, b,errorCode, latitude, longitude, c, d, e) = unpack(">hBiiiiih",bytes)
    latitude = latitude / 1000000.0
    longitude = longitude / 1000000.0

    return latitude, longitude

def get_location_by_geo(latitude, longitude):
    url = '%s?q=%s,%s&output=json&oe=utf8' % (geo_url, str(latitude), str(longitude))
    return urllib2.urlopen(url).read()

if __name__ == '__main__':
    print get_location_by_cell(20465, 495, 3, 262)
    print get_location_by_cell(20442, 6015)
    print get_location_by_cell(1085, 24040)
    print get_location_by_geo(40.714224, -73.961452)
    print get_location_by_geo(13.749113, 100.565327)
person Andrey Nikishaev    schedule 28.07.2010
comment
Но зачем нужен параметр устройства? в веб-сайтах это не требуется. Спасибо - person ransh; 10.04.2017
comment
Я пробовал функцию упаковки, и она выдает ошибку для данных (745522,22,874,405), а ошибка - struct.error: аргумент для 's' должен быть байтовым объектом. посмотрите, можете ли вы объяснить, что такое спецификация упаковки из google mmap. - person Miten; 27.09.2017
comment
@Miten Взгляните сюда developers.google.com/maps/documentation/geolocation/intro Скрипт старше 7 лет - person Andrey Nikishaev; 28.09.2017

Вы можете использовать Google Location API, который используется Firefox (пример см. на http://www.mozilla.com/en-US/firefox/geolocation/ ) с URL-адресом www.google.com/loc/json/. На самом деле это веб-сервис на основе JSON и минимальный пример Perl. Выглядит так:

use LWP;

my $ua = LWP::UserAgent->new;
$ua->agent("TestApp/0.1 ");
$ua->env_proxy();

my $req = HTTP::Request->new(POST => 'https://www.google.com/loc/json');

$req->content_type('application/jsonrequest');
$req->content('{"cell_towers": [{"location_area_code": "8721", "mobile_network_code": "01", "cell_id": "7703", "mobile_country_code": "262"}], "version": "1.1.0", "request_address": "true"}');

# Pass request to the user agent and get a response back
my $res = $ua->request($req);

# Check the outcome of the response
if ($res->is_success) {
    print $res->content;
} else {
    print $res->status_line, "\n";
    return undef;
}

Пожалуйста, имейте в виду, что Google официально не открыл этот API для других целей...

person Lairsdragon    schedule 20.03.2010
comment
спасибо Lairs Dragon, я написал версию Ruby здесь bintangjatuh. com/2011/01/27/ruby-cellid-to-location.html - person Goz; 28.01.2011
comment
Так как несколько месяцев теперь это больше не работает. Для меня неясно, нужно ли теперь использовать ключ API в запросе или функциональность удалена из API. - person Lairsdragon; 24.11.2011

Новое место для API местоположения Google: https://developers.google.com/maps/documentation/geolocation/intro

С помощью этого API вы можете получить местоположение из информации о соте (cellid, mcc, mnc и lac).

person Seraphin    schedule 30.09.2015
comment
Этот парень! Хотел бы я проголосовать сто раз. Точно. Намного более простой и хорошо документированный интерфейс! - person Ishay Peled; 23.03.2016

Основываясь на GeolocationAPI, вот некоторые части моего кода:

import java.io.IOException;
import java.io.StringWriter;
import java.net.HttpURLConnection;
import java.net.URL;

//http://code.google.com/p/google-gson/
import com.google.gson.stream.JsonWriter;

...

/**
 * Requests latitude and longitude from Google.
 * 
 * @param gsmParams
 *            {@link GsmParams}
 * @return an {@link HttpURLConnection} containing connection to Google
 *         lat-long data.
 * @throws IOException
 */
public HttpURLConnection requestLatlongFromGoogle(GsmParams gsmParams)
        throws IOException {
    // prepare parameters for POST method
    StringWriter sw = new StringWriter();
    JsonWriter jw = new JsonWriter(sw);
    try {
        jw.beginObject();

        jw.name("host").value("localhost");
        jw.name("version").value("1.1.0");
        jw.name("request_address").value(true);

        jw.name("cell_towers");

        jw.beginArray().beginObject();

        jw.name("cell_id").value(gsmParams.getCid());
        jw.name("location_area_code").value(gsmParams.getLac());
        jw.name("mobile_network_code").value(gsmParams.getMnc());
        jw.name("mobile_country_code").value(gsmParams.getMcc());

        jw.endObject().endArray().endObject();
    } finally {
        try {
            jw.close();
        } catch (IOException ioe) {
        }
        try {
            sw.close();
        } catch (IOException ioe) {
        }
    }
    final String JsonParams = sw.toString();
    final String GoogleLocJsonUrl = "http://www.google.com/loc/json";

    // post request
    URL url = null;
    HttpURLConnection conn = null;
    url = new URL(GoogleLocJsonUrl);
    conn = (HttpURLConnection) url.openConnection();
    conn.setConnectTimeout((int) 30e3);
    conn.setReadTimeout((int) 30e3);

    conn.setDoOutput(true);
    conn.setRequestMethod("POST");
    conn.getOutputStream().write(JsonParams.getBytes());
    conn.getOutputStream().flush();
    conn.getOutputStream().close();
    int resCode = conn.getResponseCode();
    if (resCode == Http_BadRequest || resCode != Http_Ok) {
        throw new IOException(String.format(
                "Response code from Google: %,d", resCode));
    }
    return conn;
}

Объект GsmParams — это просто Java-бин, содержащий параметры GSM MCC, MNC, LAC, CID. Я думаю, вы можете легко создать такой же класс.

После подключения вы можете позвонить conn.getInputStream() и получить результаты из Google Maps. Затем используйте JsonReader для анализа данных...

person Community    schedule 20.02.2012
comment
Поскольку Google Gears был закрыт с марта 2011 года, пришло время также попрощаться с API геолокации, на котором работала Google Gears. API геолокации Google Gears перестанет отвечать на запросы 17 ноября 2012 г. - person Gunnar Bernstein; 19.11.2013

Как отмечалось в других темах, также проверьте https://labs.ericsson.com/apis/mobile-location/documentation/cell-id-look-up-api для бесплатной базы данных идентификаторов ячеек для получения координат от cellid, mcc, mnc и lac .

person Cri    schedule 21.10.2009
comment
что мне нужно точно знать, так это о сервисах Google (API), но спасибо за предложение, о да, я смотрю OpenCellID как альтернативный сервис - person Dels; 22.10.2009