Google Maps, CelllD zu Ort
-
22-09-2019 - |
Frage
Nach diesem Beispiel:
http://www.codeproject.com/KB/mobile/DeepCast.aspx
Es ist möglich, ein GPS-Koordinaten (Längen- und Breitengrad) einschließlich Bereich zu erhalten, wenn CelllD Informationen (MCC, MNC, towerid, etc.) Senden
Kann jemand sagen Sie mir den aktuellen Parameter auf Anfrage / Post an diese Adresse?
http://www.google.com/glm/mmap
Es könnte so etwas wie diese
http://www.google.com/glm/mmap?mcc=xxx&mnc=xxx&towerid=xxx
Und ich möchte wissen, welche Antwort wir bekommen würden.
habe ich Opencellid Website beobachten und sie bieten einige nette API zu beginnen, aber ich möchte auch über die in Google-Map wissen (da sie mehr abgeschlossen Datenbank).
Lösung
Hier ist Beispiel für die Arbeit mit
#!/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)
Andere Tipps
Sie könnten die Google Location API verwenden, die von Firefox (Beispiel siehe unter verwendet wird http://www.mozilla.com/en-US/firefox/geolocation/ ), die die uRL www.google.com/loc/json/ hat. In der Tat ist dies JSON basierten Webservice und einen minimalen Perl Beispiel wie folgt aussehen:
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;
}
Beachten Sie bitte, dass Google diese API für andere Zwecke nicht offiziell geöffnet hat ...
Base auf GeolocationAPI , hier sind einige Teile meines Code:
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;
}
Das Objekt GsmParams
ist nur ein Java-Bean enthält GSM-Parameter MCC, MNC, LAC, CID. Ich denke, man kann leicht eine gleiche Klasse erstellen.
Nach dem Anschluss erhalten, können Sie conn.getInputStream()
anrufen und erhalten Ergebnisse von Google Maps. Dann nutzen JsonReader
Daten Parsen ...
Der neue Ort für den Google Standort-API ist die folgende: https://developers.google.com/maps/documentation/geolocation/intro
Mit dieser API können Sie einen Standort aus Zellinformationen (CelllD, mcc, MNC und lac)
abrufenWie bereits in anderen Threads auch Besuche https://labs.ericsson.com/apis/mobile-location/documentation/cell-id-look-up-api für eine Datenbank mit freien Zellen-ID-Koordinaten von CelllD, mcc, MNC zu erhalten, und lac.