2013-07-19 1 views
0

Я пытаюсь использовать библиотеку Proj4 для преобразования различных проекций карт для использования с Apple Map Kit. В целях тестирования я думал, что начну с дублирования функции MKMapPointForCoordinate с помощью Proj4.CLLocationCoordinate2D to MKMapPoint с использованием PROJ4

Эти определения, которые я использую:

+proj=longlat +ellps=WGS84 +datum=WGS84 [email protected] +no_defs 
+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m [email protected] +no_defs 

Когда я использую координатой 47,5, -97,3 возвращается преобразования Proj4:

6028687.013553943, -10834169,44145535

Но MKMapPointForCoordinate возвращает: 61646948.12444445, 93835627.5941129, что на порядок выше.

Размер мира для карт Kit является 268435456 х 268435456

+0

Почему бы просто не использовать широту и долготу из proj4 как есть в MapKit вместо преобразования в MKMapPoint? – Anna

+0

Я пытаюсь понять правильные настройки для Proj4, и тест выше был самым простым способом, который я знал, чтобы проверить, какие результаты я получаю от Proj4 и MKMapPointForCoordinate, - это то же самое. Моя актуальная проблема сложнее, поэтому я хотел сначала начать с простой/основной проблемы. Я, например, даже не могу понять, где вы можете указать диапазон декартовых координат с помощью Proj4, так как отображается Google Map и MapKit имеют разные диапазоны. – dbainbridge

+0

Хорошо, я неправильно понял вашу цель. – Anna

ответ

0

Со следующими определениями:

+ проектируемый = longlat + ellps = WGS84 + ИГД = WGS84 + nadgrids = @ нуль + no_defs

+ proj = merc + lon_0 = 0 + lat_ts = 0 + x_0 = 134217728.0 + y_0 = 134217728.0 + a = 6378137 + b = 6378137 + k = 1,0 + единиц = m + nadgrids = @ null + no_defs

есть один больше шага, чтобы закрыть промежуток между Mapkit и Proj4: линейная регрессия в x и - линейная регрессия по y.

let const_x = 114180219.657211 
let a1_x = -0.850708929130513 

private func mk_x_forProjX(projX: Double) -> Double { 
    return (projX - self.const_x)/(self.a1_x + 1) 
} 

private func proj_x_forMKX(mkX: Double) -> Double { 
    return mkX * (self.a1_x + 1) + self.const_x 
} 

let const_y = 154255236.342789 
let a1_y = -1.14929107086948 

private func mk_y_forProjY(projY: Double) -> Double { 
    return (projY - self.const_y)/(self.a1_y + 1) 
} 

private func proj_y_forMKY(mkY: Double) -> Double { 
    return mkY * (self.a1_y + 1) + self.const_y 
} 

Подгонка не идеальна, но точность удовлетворительная.

Один последний пункт, обязательно использовать Double при преобразовании градусов < -> радианов, т.е.

static func DegreesToRadians (value:Double) -> Double { 
    return value * M_PI/180.0 
} 

static func RadiansToDegrees (value:Double) -> Double { 
    return value * 180.0/M_PI 
} 
Смежные вопросы