2015-07-16 4 views
0

У меня есть два очка и вы хотите нарисовать стрелу между ними. Я использую OpenLayers2. Код, который создает точки выглядит следующим образом:Как нарисовать стрелку к краю точки

var pt = new OpenLayers.Symbolizer.Point({ 
    fillColor: color, 
    ....[other settings here].... 
    pointRadius: radius 
}); 

И я создаю ломаную линию между ними, а затем создать стрелку в точке 2.

var angle = this.calculateAngle(pt1[0], pt1[1], pt2[0], pt2[1]); 

var point = new OpenLayers.Geometry.Point(pt2[0], pt2[1]); 
point.transform(coreMap.Map.SOURCE_PROJECTION, 
    coreMap.Map.DESTINATION_PROJECTION); 

var featureArrow = new OpenLayers.Feature.Vector(point); 

OpenLayers.Renderer.symbol.arrow = [0,0, 0,arrowWidth, (arrowWidth/2),(arrowWidth - 7), arrowWidth,arrowWidth, 0,arrowWidth]; 

featureArrow.style = new OpenLayers.Symbolizer.Point({ 
    strokeWidth: 1, 
    graphicName: "arrow", 
    ...[other settings here]...   
    rotation: angle, 
    strokeLinecap: "round" 
}); 

Это все работает, за исключением того, когда радиус пункта 2 большой, то стрелка указывает на середину pt2 и скрыта Точкой. Я хочу, чтобы стрелка указывала на край Точки. Если бы я был в картезианской 2D-плоскости без масштабирования, я мог бы просто сдвинуть стрелку в направлении pt1 (так как я знаю угол) по радиусу. Однако pt1 и pt2, конечно, находятся в lat/lon, а радиус - в пикселях. Как настроить расположение стрелки так, чтобы она указывала на правильное местоположение (край [возможно большой] точки)?

ответ

2

Используя map.getExtent() и map.maxPx, вы можете определить сумму для вычитания из того места, где заканчивается ваша стрелка.

map.getExtent() 

Найден видимый ограничивающий прямоугольник вашей карты.

map.maxPx() 

Дает вам количество пикселей на карту. Если мы хотим, чтобы найти смещение от радиуса от вашей функции для широты вы можете просто ...

var y = map.getExtent().top-map.getExtent().bottom; 
var diffY = y/map.maxPx.y * feature.radius; 
correctedArrowEnd = oldArrowEnd.y - diffY; 

И сделать то же самое для й значения.

Надеюсь, это поможет!

+0

Спасибо за ответ; отлично. –

Смежные вопросы