La ragione per la GPS offset in China è una combinazione di tecnologia (diversi dati) e interessi politici/economici.
A causa di "problemi di sicurezza", la Cina utilizza un diverso sistema di coordinate dal resto del mondo - GCJ-02 anziché lo standard WGS-84 utilizzato dai satelliti GPS e dalla maggior parte delle mappe. Tutte le mappe della Cina devono essere approvate dal Consiglio di Stato al fine di contrassegnare la posizione della Cina su vari beni politicamente controversi (Tibet, Taiwan, ecc.). L'approvazione richiede anche che le mappe utilizzino GCJ-02. Questo fa sì che le posizioni del WGS-84, come le tracce GPS da un ricevitore GPS non adulterato, appaiano "off" quando tracciate su mappe stradali cinesi.
Un altro sistema di coordinate non è normalmente un problema, ma la Cina ha scelto di cifrare GCJ-02, quindi non c'era alcuna trasformazione lineare. Il primo attempt at a conversion utilizzato a database of coordinates obtained from Google China Maps (ditu.google.com) quando era in grado di calcolare la deviazione nel 2010. Questo era un metodo di interpolazione e un po 'impreciso. I set di dati sono stati messi in vendita con offsets calculated for thousands of Chinese cities.
Nel frattempo l'algoritmo GCJ-02 è stato trapelato ed è un "segreto pubblico" (la ricerca di "conversione GCJ-02" trova molti risultati). Di nota popolare è il progetto eviltransform, che offre API di conversione per C, C#, Go, Java, JavaScript e PHP. Il geoChina library gestisce la conversione tra GJC-02, WGS-084 e Baidu BD-09, utilizzando R.
Il codice non è banale, e svolge anche un very roughbounding box check per determinare se un luogo è in Cina:
function outOfChina(lat, lng) {
if ((lng < 72.004) || (lng > 137.8347)) {
return true;
}
if ((lat < 0.8293) || (lat > 55.8271)) {
return true;
}
return false;
}
che include la maggior parte dell'India, tutto il Sud e Corea del Nord, Filippine, Vietnam, Mongolia, Thailandia, e una miriade di altri paesi:
Un miglioramento consisterebbe nell'utilizzare un limite di poligono, ad esempio china.kml.
Ho scaricato l'ultima API 1.2.1 e ho ancora lo stesso problema. Se usi SDKDemos, la posizione mostrata è diversa dalla posizione sulla mappa google ufficiale. Sempre fuori da 1-2 isolati. Sembra essere solo in Cina. Qualche correzione? – Josh
Il problema con Yoru è fisso o no? stai testando su simulatore o dispositivo? –
Ho creato una categoria su CLLocation che può compensare la posizione in Cina per compensare l'errore: https://github.com/maxime/ChinaMapDeviation – maximeguilbot