2017-01-09 15 views
0

У меня есть ограничительная рамка:Преобразовать Lat/Long для X, Y позиции внутри ограничительного Box

Left -122.27671 
Bottom 37.80445 
Right -122.26673 
Top 37.81449 

Он также может быть преобразован в NE Lat/Long и SW Lat/Long

В этот ограничивающий ящик, я бы хотел найти позицию X, Y определенного Lat/Long. Это будет использовать проекцию Меркатора.

Я видел ответы, которые находят X, Y позиции на карте мира, используя Меркатор, но не в пределах конкретного lat/lon.

Любая помощь оценена!

ОБНОВЛЕНИЕ Объедините это вместе с другим вопросом, который я видел. Может ли кто-нибудь подтвердить, что это кажется законным?

map_width = 1240 
map_height = 1279 

map_lon_left = -122.296916 
map_lon_right = -122.243380 
map_lon_delta = map_lon_right - map_lon_left 

map_lat_bottom = 37.782368 
map_lat_bottom_degree = map_lat_bottom * Math::PI/180 

def convert_geo_to_pixel(lat, long) 
    x = (long - map_lon_left) * (map_width/map_lon_delta) 

    lat = lat * Math::PI/180 
    world_map_width = ((map_width/map_lon_delta) * 360)/(2 * Math::PI) 
    map_offset_y = (world_map_width/2 * Math.log((1 + Math.sin(map_lat_bottom_degree))/(1 - Math.sin(map_lat_bottom_degree)))) 
    y = map_height - ((world_map_width/2 * Math.log((1 + Math.sin(lat))/(1 - Math.sin(lat)))) - map_offset_y) 

    return [x, y] 
end 

ответ

0

Найденный лучшее решение, которое я тестировал и проверял. Публикация этого для всех, кто может найти это полезным. Он написан на Ruby, но легко конвертируется на любой другой язык

@north = to_radians(37.81449) 
@south = to_radians(37.80445) 
@east = to_radians(-122.26673) 
@west = to_radians(-122.27671) 
# Coordinates above are a subsection of Oakland, CA 

@map_width = map_width 
@map_height = map_height 

def location_to_pixel(lat:, lon:) 
    lat = to_radians(lat) 
    lon = to_radians(lon) 
    ymin = mercator_y(@south) 
    ymax = mercator_y(@north) 
    x_factor = @map_width/(@east - @west) 
    y_factor = @map_height/(ymax - ymin) 

    y = mercator_y(lat); 
    x = (lon - @west) * x_factor 
    y = (ymax - y) * y_factor 
    [x, y] 
end 

def to_radians(deg) 
    deg * Math::PI/180 
end 

def mercator_y(lat) 
    Math.log(
     Math.tan(lat/2 + Math::PI/4) 
    ) 
end 
0

Давайте s является сдвиг карты в мировом пространстве, нижняя широта в радианах B, верхняя широта T. (я предполагаю, что у = 0 есть нижняя)

enter image description here

C * Sin(B) = 0 + s 
C * Sin(T) = map_height + s 
=> 
C = map_height/(Sin(T) - Sin(B)) 
s = C * Sin(B) 
y = C * Sin(Lat) - s = 
    C * Sin(Lat) - C * Sin(B) = 
    C * (Sin(Lat) - Sin(B)) = 
    map_height * (Sin(Lat) - Sin(B)/(Sin(T) - Sin(B)) 

     // note - resembles linear interpolation is sine space 
+0

Является ли код, который я использовал выше, неверным? У вас возникли проблемы с пониманием того, где ваш пример выводит «x, y», когда задан параметр lat/lon в ограничивающей рамке? – theartofbeing

+0

Ваш x правильный расчет. y кажется неправильным. My Lat соответствует вашему lat, B = map_lat_bottom, T = map_lat_top (не вижу его в вашем коде) – MBo

+0

Я скопировал свое решение с http://stackoverflow.com/questions/2103924/mercator-longitude-and-latitude- расчеты-to-x-and-y-on-a-crop-map of of the/10401734 # 10401734 Я верю map_lat слева и справа вверху слева и справа вверху. Поскольку мы знаем, где находится угол, все, что нам нужно, это лат дна, чтобы закончить квадрат. Так я интерпретировал это решение? – theartofbeing