2015-12-22 5 views
1

У меня есть карта с координатами в метрах и наложение плана здания с пиксельными координатами:Преобразования координат между двумя вращающимися системами

Sample map with plan overlay

Я уже знаю, масштабный фактор, и я могу преобразовать координаты между две системы, если они совпадают (то есть наложение изображения строго горизонтально, без вращения) -> conversionfactor (= количество наложения пикселей в один метр на карте)

MAPx(ImageX) = centerpointX + ImageX * conversionfactor 
MAPy(ImageY) = centerpointY + ImageY * conversionfactor 

Как я могу конвертировать между координаты, если наложение повернуто, если у меня есть формулы выше, и я хочу включить угол поворота?

EDIT (@tsauerwein):

Вот стиль маркера, который вы запросили:

planStyle = function(feature, resolution){ 
     var style = new ol.style.Style({ 
      image: new ol.style.Icon({ 
       src: feature.dataURL, 
       scale: feature.resolution/resolution, 
       rotateWithView: true, 
       rotation: feature.rotation * (Math.PI/180), 
       anchor: [.5, .5], 
       anchorXUnits: 'fraction', 
       anchorYUnits: 'fraction', 
       opacity: feature.opacity 
      }) 
     }) 
     return [style]; 
    }; 
+0

@Craicerjack Почему вы отказались от редактирования? [tag: openlayers] не следует использовать с [tag: openlayers-3]. Это сказано в описании. [См. Этот Meta Post] (http://meta.stackoverflow.com/q/321540/5620297) – Druzion

ответ

1

Предполагая, что вы используете ol.source.ImageStatic: При настройке слоя, то есть размер самого изображение в пикселях (например, ширина = 500, высота = 200), а также степень, в которой это изображение покрывает в координатах.

Теперь, если у вас есть координата, вы можете легко проверить, находится ли координата внутри изображения (ol.extent.containsXY(extent, x, y)). После этого вы можете также перевести реального мира координат пикселя координат:

// image size 
var width = 500; 
var height = 250; 

// image extent 
var extent = [2000, 0, 4000, 1000]; 

// coordinates 
var x = 3000; 
var y = 500; 

if (ol.extent.containsXY(extent, x, y)) { 
    var pixelX = width * (x - extent[0])/ol.extent.getWidth(extent); 
    var pixelY = height * (y - extent[1])/ol.extent.getHeight(extent); 
} 

делая это так, это не имеет значения, если карта вращается или нет.

+0

Насколько я знаю, невозможно повернуть статический источник изображения, но мне нужно выполнить поворот с помощью ol и не может сохранить измененную версию заранее, а затем импортировать полученное изображение. – Chris

+0

Извините, я неправильно понял ваш вопрос. Я думал, вы говорите о повернутой карте. Вы правы, невозможно повернуть изображение с помощью источника «ImageStatic». Как вы сейчас показываете план здания на карте? – tsauerwein

+0

Я использую ol.style.Icon, который предоставляет свойство поворота – Chris