google maps, Cellid à l'emplacement
-
22-09-2019 - |
Question
Selon cet exemple:
http://www.codeproject.com/KB/mobile/DeepCast.aspx
Il est possible de demander un coordonnées GPS (longitude et latitude) y compris la gamme lors de l'envoi d'informations CellID (MCC, MNC, towerid, etc)
Quelqu'un peut me dire le paramètre réel de demander / courrier à cette adresse?
http://www.google.com/glm/mmap
Il pourrait être quelque chose comme ça
http://www.google.com/glm/mmap?mcc=xxx&mnc=xxx&towerid=xxx
Et je voudrais savoir quelle réponse nous obtiendrions.
J'observer le site web OpenCellID et ils fournissent une API agréable pour commencer, mais je veux savoir à ce sujet sur la carte google trop (car ils ont plus la base de données terminée).
La solution
Voici par exemple pour le travail avec
#!/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)
Autres conseils
Vous pouvez utiliser l'API Google emplacement qui est utilisé par Firefox (voir par exemple http://www.mozilla.com/en-US/firefox/geolocation/ ) qui a la www.google.com/loc/json/ url. En fait c'est webservice base JSON et un minimum Perl exemple ressembler à ceci:
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;
}
S'il vous plaît garder à l'esprit que Google n'a pas ouvert officiellement cette API pour d'autres usages ...
GeolocationAPI , voici quelques parties de mon 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;
}
Le GsmParams
objet est juste un bean Java contenant des paramètres GSM MCC, MNC, LAC, CID. Je pense que vous pouvez créer une même classe facilement.
Après avoir obtenu la connexion, vous pouvez appeler conn.getInputStream()
et obtenir des résultats de Google Maps. Ensuite, utilisez JsonReader
pour analyser les données ...
La nouvelle place pour l'API de localisation de Google est le suivant: https://developers.google.com/maps/documentation/geolocation/intro
Avec cette API, vous pouvez récupérer un emplacement à partir des informations de cellule (CellID, mcc, RNM et lac)
Comme indiqué dans d'autres threads vérifier également https://labs.ericsson.com/apis/mobile-location/documentation/cell-id-look-up-api pour une base de données cellule-ID libre pour obtenir les coordonnées de CellID, mcc, RNM, et lac.