Причиной GPS offset in China является сочетание технологии (разные датумов) и политические/экономические интересы.
В связи с «проблемами безопасности» в Китае используется другая система координат от остального мира - GCJ-02 вместо стандарта WGS-84, используемого спутниками GPS и подавляющим большинством карт. Все карты Китая должны быть одобрены Государственным советом, чтобы отметить позицию Китая в отношении различных политически оспариваемых владений (Тибет, Тайвань и т. Д.). Утверждение также требует, чтобы карты использовали GCJ-02. Это приводит к тому, что местоположения WGS-84, такие как GPS-треки от неподдельного GPS-приемника, будут отображаться «выключены» при построении на китайских уличных картах.
Другая система координат обычно не является проблемой, но Китай решил зашифровать GCJ-02, так что не было никакой прямой трансформации. Первый attempt at a conversion использовал a database of coordinates obtained from Google China Maps (ditu.google.com), когда раньше он мог рассчитывать отклонение в 2010 году. Это был метод интерполяции и несколько неточно. Наборы данных пошли на продажу с offsets calculated for thousands of Chinese cities.
В то же время алгоритм GCJ-02 просочился и является «публичной тайной» (поиск «конверсии GCJ-02» находит множество результатов). Популярным является проект eviltransform, который предлагает API конверсий для C, C#, Go, Java, JavaScript и PHP. geoChina library обрабатывает преобразование между GJC-02, WGS-084 и Бэйду BD-09, используя R.
код нетривиально, а также выполняет very roughbounding box check, чтобы определить, есть ли место в Китае:
function outOfChina(lat, lng) {
if ((lng < 72.004) || (lng > 137.8347)) {
return true;
}
if ((lat < 0.8293) || (lat > 55.8271)) {
return true;
}
return false;
}
Это включает в себя большую часть Индии, всей Южной и Северной Кореи, Филиппин, Вьетнама, Монголии, Таиланда, а также множество других стран:
Улучшение должно было бы использовать границу многоугольника, такую как china.kml.
Я загрузил новейший API 1.2.1 и все еще имею ту же проблему. Использование SDKDemos при условии, что указанное местоположение отличается от местоположения на официальных картах Google. Всегда на 1-2 блока. Кажется, это просто в Китае. Любое исправление? – Josh
Вопрос Yoru исправлен или нет? вы тестируете на тренажере или устройстве? –
Я создал категорию на CLLocation, которая может компенсировать позицию в Китае, чтобы компенсировать ошибку: https://github.com/maxime/ChinaMapDeviation – maximeguilbot