2017-12-12 106 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] 
     }) 
    }), 

のスタイルで、私のコードが動作します。しかし、例からLinestringのスタイルを入れると、「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')]; 
} 

を呼び出したときにそれは種類アイコン-アイコン-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

関連する問題