2017-12-12 43 views
1

각 행의 끝 부분에 화살표가있는 선 스트링을 만들어 경로의 방향을 표시하려고합니다. 공식 사이트의 예제를 사용합니다 : https://openlayers.org/en/latest/examples/line-arrows.html 예제 코드는 사용자의 그림에 의해 화살표를 만듭니다. 그러나 주어진 LineString에 화살표가 필요합니다. 내 코드에는 경로의 종료 및 완료 아이콘이 있습니다. 사용시Openlayers에서 선 방향 화살표 4

'route': new ol.style.Style({ 
     stroke: new ol.style.Stroke({ 
     width: 6, color: [23, 120, 22, 0.6] 
     }) 
    }), 

스타일로 제 코드가 작동합니다. 그러나 예제에서 선 스트링에 스타일을 적용하면 "Uncaught TypeError : c.Y가 함수가 아닙니다."라는 오류가 발생합니다.

var points = [ 
 
    [76.8412, 43.2245], [76.8405, 43.2210], [76.8479, 43.2200], [76.8512, 43.2220] 
 
]; 
 

 
var route = new ol.geom.LineString(points); 
 
route.transform('EPSG:4326', 'EPSG:3857'); 
 

 
var routeFeature = new ol.Feature({ 
 
    type: 'route', 
 
    geometry: route 
 
}); 
 
var startMarker = new ol.Feature({ 
 
    type: 'icon-a', 
 
    geometry: new ol.geom.Point(ol.proj.fromLonLat(points[0])) 
 
}); 
 
var endMarker = new ol.Feature({ 
 
    type: 'icon-b', 
 
    geometry: new ol.geom.Point(ol.proj.fromLonLat(points[points.length - 1])) 
 
}); 
 

 
var styles = { 
 
    'route': function(feature) { 
 
    var geometry = feature.getGeometry(); 
 
    var styles = [ 
 
     // linestring 
 
     new ol.style.Style({ 
 
     stroke: new ol.style.Stroke({ 
 
      color: '#ffcc33', 
 
      width: 2 
 
     }), 
 
     image: new ol.style.Icon({ 
 
     anchor: [0.5, 1], 
 
     src: 'img/icon-a.png' 
 
    }) 
 
     }) 
 
    ]; 
 

 
    geometry.forEachSegment(function(start, end) { 
 
     var dx = end[0] - start[0]; 
 
     var dy = end[1] - start[1]; 
 
     var rotation = Math.atan2(dy, dx); 
 
     // arrows 
 
     styles.push(new ol.style.Style({ 
 
     geometry: new ol.geom.Point(end), 
 
     image: new ol.style.Icon({ 
 
      src: 'https://openlayers.org/en/v4.6.3/examples/data/arrow.png', 
 
      anchor: [0.75, 0.5], 
 
      rotateWithView: true, 
 
      rotation: -rotation 
 
     }) 
 
     })); 
 
    }); 
 

 
    return styles; 
 
    }, 
 
    'icon-a': new ol.style.Style({ 
 
    image: new ol.style.Icon({ 
 
     anchor: [0.5, 1], 
 
     src: 'img/icon-a.png' 
 
    }) 
 
    }), 
 
    'icon-b': new ol.style.Style({ 
 
    image: new ol.style.Icon({ 
 
     anchor: [0.5, 1], 
 
     src: 'img/icon-b.png' 
 
    }) 
 
    }) 
 
}; 
 

 
var vectorLayer = new ol.layer.Vector({ 
 
    source: new ol.source.Vector({ 
 
    features: [routeFeature, startMarker, endMarker] 
 
    }), 
 
    style: function(feature) { 
 
    return styles[feature.get('type')]; 
 
    } 
 
}); 
 

 
var center = ol.proj.fromLonLat([76.8512, 43.2220]); 
 
var map = new ol.Map({ 
 
    target: document.getElementById('map'), 
 
    view: new ol.View({ 
 
    center: center, 
 
    zoom: 15, 
 
    minZoom: 2, 
 
    maxZoom: 19 
 
    }), 
 
    layers: [ 
 
    new ol.layer.Tile({ 
 
     source: new ol.source.OSM() 
 
    }), 
 
    vectorLayer 
 
    ] 
 
});
#map { 
 
    /* just for testing purposes */ 
 
    width: 100%; 
 
    min-width: 100px; 
 
    max-width: 500px; 
 
    margin-top: 50px; 
 
    height: 50px; 
 
}
<link href="https://openlayers.org/en/v4.6.4/css/ol.css" rel="stylesheet"/> 
 
<script src="https://openlayers.org/en/v4.6.4/build/ol-debug.js"></script> 
 
<div id="map"></div>

+0

당신이 보여주고 예제는 물론 openlayer의 v4.6.4 – programtreasures

+0

, V4를위한 것입니다

다음은 실행 가능한 예제입니다. 나는 고쳤다. – CenturionKZ

답변

0

첫째, 대신 ol.jsol-debug.js를 사용하여 압축하고 디버깅하는 데 도움이 :

여기 내 코드입니다. 예외는

TypeError: style.getImage is not a function (Line 30443)

입니다. 스타일 개체가 혼합되어 있기 때문에 오류가 발생합니다. 일부 스타일은 기능이며 일부는 일반 스타일 개체입니다.

OL이 둘 다 처리 할 수 ​​있다고 생각할 수도 있지만 보통 옳습니다. 그러나 vectorLayer에 기능을 제공하므로 OL에서 사용자가 기능을 제공하고 호출했음을 감지합니다. 그 함수의 반환 값은 스타일 객체 일 것으로 기대된다. 그러나 route의 경우, 대신 함수가 반환됩니다!

그래서 OL이 호출 할 때

style: function(feature) { 
    return styles[feature.get('type')]; 
} 

그것은 종류의 스타일을 얻을 수 아이콘-A, 아이콘-B하지만 경로에 대한 기능. 당신은 특별한 경우 처리하도록 스타일의 기능을 강화해야

style: function(feature) { 
    const myStyle = stylesMap[feature.get('type')]; 
    if (myStyle instanceof Function) { 
    return myStyle(feature); 
    } 
    return myStyle; 
} 

PS : 두 변수에 같은 이름을 사용 (스타일) 나쁜 관행이 이상한 버그가 발생할 수 있습니다.

var points = [ 
 
    [76.8412, 43.2245], [76.8405, 43.2210], [76.8479, 43.2200], [76.8512, 43.2220] 
 
]; 
 

 
var route = new ol.geom.LineString(points); 
 
route.transform('EPSG:4326', 'EPSG:3857'); 
 

 
var routeFeature = new ol.Feature({ 
 
    type: 'route', 
 
    geometry: route 
 
}); 
 
var startMarker = new ol.Feature({ 
 
    type: 'icon-a', 
 
    geometry: new ol.geom.Point(ol.proj.fromLonLat(points[0])) 
 
}); 
 
var endMarker = new ol.Feature({ 
 
    type: 'icon-b', 
 
    geometry: new ol.geom.Point(ol.proj.fromLonLat(points[points.length - 1])) 
 
}); 
 

 
var stylesMap = { 
 
    'route': function(feature) { 
 
    var geometry = feature.getGeometry(); 
 
    var styles = [ 
 
     // linestring 
 
     new ol.style.Style({ 
 
     stroke: new ol.style.Stroke({ 
 
      color: '#ffcc33', 
 
      width: 2 
 
     }), 
 
     image: new ol.style.Icon({ 
 
      anchor: [0.5, 1], 
 
      src: 'img/icon-a.png' 
 
     }) 
 
     }) 
 
    ]; 
 

 
    geometry.forEachSegment(function(start, end) { 
 
     var dx = end[0] - start[0]; 
 
     var dy = end[1] - start[1]; 
 
     var rotation = Math.atan2(dy, dx); 
 
     // arrows 
 
     styles.push(new ol.style.Style({ 
 
     geometry: new ol.geom.Point(end), 
 
     image: new ol.style.Icon({ 
 
      src: 'https://openlayers.org/en/v4.6.3/examples/data/arrow.png', 
 
      anchor: [0.75, 0.5], 
 
      rotateWithView: true, 
 
      rotation: -rotation 
 
     }) 
 
     })); 
 
    }); 
 

 
    return styles; 
 
    }, 
 
    'icon-a': new ol.style.Style({ 
 
    image: new ol.style.Icon({ 
 
     anchor: [0.5, 1], 
 
     src: 'img/icon-a.png' 
 
    }) 
 
    }), 
 
    'icon-b': new ol.style.Style({ 
 
    image: new ol.style.Icon({ 
 
     anchor: [0.5, 1], 
 
     src: 'img/icon-b.png' 
 
    }) 
 
    }) 
 
}; 
 

 
var vectorLayer = new ol.layer.Vector({ 
 
    source: new ol.source.Vector({ 
 
    features: [routeFeature, startMarker, endMarker] 
 
    }), 
 
    style: function(feature) { 
 
    const myStyle = stylesMap[feature.get('type')]; 
 
    if (myStyle instanceof Function) { 
 
     return myStyle(feature); 
 
    } 
 
    return myStyle; 
 
    } 
 
}); 
 

 
var center = ol.proj.fromLonLat([76.8512, 43.2220]); 
 
var map = new ol.Map({ 
 
    target: document.getElementById('map'), 
 
    view: new ol.View({ 
 
    center: center, 
 
    zoom: 15, 
 
    minZoom: 2, 
 
    maxZoom: 19 
 
    }), 
 
    layers: [ 
 
    new ol.layer.Tile({ 
 
     source: new ol.source.OSM() 
 
    }), 
 
    vectorLayer 
 
    ] 
 
});
#map { 
 
    /* just for testing purposes */ 
 
    width: 100%; 
 
    min-width: 100px; 
 
    max-width: 500px; 
 
    margin-top: 50px; 
 
    height: 200px; 
 
}
<link href="https://openlayers.org/en/v4.6.4/css/ol.css" rel="stylesheet"/> 
 
<script src="https://openlayers.org/en/v4.6.4/build/ol-debug.js"></script> 
 
<div id="map"></div>

+1

그것은 작동한다! 너무 자세히 설명해 주셔서 감사합니다! 당신은 말 그대로 내 목숨을 구했습니다. – CenturionKZ