2017-10-17 17 views
2

既にロードされた点と右クリックされた点の間に線を追加しようとしています。私はMapboxの例を参照して、この段階まで来ました。私は操作を初めて実行するときに1行しか得られません。私はそれぞれの操作のための行が必要です。次のように操作の順序は以下のとおりです。GeoJson LineString Mapboxで最初にクリックした後に一度だけロードする

  1. 左クリックし、ロードされた時点(にGeoJSONからロードされた時点)
  2. を右地図上の任意の場所をクリックします。 これは、右クリックされたポイントにマーカーを作成し、それを前の左のclcikedポイントと結合する必要があります。

私はいくつかの助けに感謝します。これは私の最初の投稿です。私の最後からの間違いをお許しください。前もって感謝します。

mapboxgl.accessToken = 'pk.eyJ1Ijoic3ViaGFtYmFuc3BocyIsImEiOiJjajc4czNxazEyaWE5MnFwaWllNzdwdDdkIn0.6AZVCVM-wGgh5cykoII9kA'; 
 
var map = new mapboxgl.Map({ 
 
    container: 'map', // container id 
 
    style: 'mapbox://styles/mapbox/streets-v9', 
 
    center: [-80.486052, 37.830348], // starting position 
 
    zoom: 5 // starting zoom 
 
}); 
 

 

 
map.on('load',() => { 
 

 
    map.addSource("earthquakes", { 
 
    type: "geojson", 
 

 
    data: "https://www.mapbox.com/mapbox-gl-js/assets/earthquakes.geojson" 
 
    }); 
 

 
    map.addLayer({ 
 
    id: "markers", 
 
    type: "circle", 
 
    source: "earthquakes", 
 
    paint: { 
 
     "circle-color": "#11b4da", 
 
     "circle-radius": 4, 
 
     "circle-stroke-width": 1, 
 
     "circle-stroke-color": "#fff" 
 
    } 
 
    }); 
 
}); 
 

 
map.on('mouseenter', 'markers',() => { 
 
    map.getCanvas().style.cursor = 'pointer' 
 
}); 
 

 
map.on('mouseleave', 'markers',() => { 
 
    map.getCanvas().style.cursor = 'crosshair' 
 
}); 
 

 
let ground 
 
let obs 
 
map.on('contextmenu', (f) => { 
 
    ground = [f.lngLat.lng, f.lngLat.lat] 
 
    var geojson = { 
 
    "type": "FeatureCollection", 
 
    "features": [{ 
 
     "type": "Feature", 
 
     "geometry": { 
 
     "type": "Point", 
 
     "coordinates": f.lngLat 
 
     } 
 
    }] 
 
    }; 
 
    // add markers to map 
 
    geojson.features.forEach(function(marker) { 
 
    // create a DOM element for the marker 
 
    var el = document.createElement('div'); 
 
    el.className = 'marker'; 
 
    el.addEventListener('click', function() { 
 
     window.alert(f.lngLat); 
 
    }) 
 
    new mapboxgl.Marker(el) 
 
     .setLngLat(marker.geometry.coordinates) 
 
     .addTo(map); 
 

 
    map.addLayer({ 
 
     "id": "route", 
 
     "type": "line", 
 
     "source": { 
 
     "type": "geojson", 
 
     "data": { 
 
      "type": "FeatureCollection", 
 
      "features": [{ 
 
      "type": "Feature", 
 
      "geometry": { 
 
       "type": "LineString", 
 
       "coordinates": [ 
 
       ground, obs 
 
       ] 
 
      } 
 
      }, ] 
 
     } 
 
     }, 
 
     "layout": { 
 
     "line-join": "round", 
 
     "line-cap": "round" 
 
     }, 
 
     "paint": { 
 
     "line-color": "#888", 
 
     "line-width": 3, 
 
     "line-dasharray": [0.1, 1.8] 
 
     } 
 

 
    }); 
 

 
    }); 
 

 
}) 
 

 

 
map.on('click', 'markers', (e) => { 
 
    obs = [e.lngLat.lng, e.lngLat.lat] 
 
});
body { 
 
    margin: 0; 
 
    padding: 0; 
 
} 
 

 
#map { 
 
    position: absolute; 
 
    top: 0; 
 
    bottom: 0; 
 
    width: 100%; 
 
} 
 

 
.marker { 
 
    display: block; 
 
    border: none; 
 
    border-radius: 50%; 
 
    cursor: pointer; 
 
    padding: 0; 
 
    background-color: rgba(5, 4, 244, 0.82); 
 
    height: 10px; 
 
    width: 10px 
 
}
<!DOCTYPE html> 
 
<html> 
 

 
<head> 
 
    <meta charset='utf-8' /> 
 
    <title></title> 
 
    <meta name='viewport' content='initial-scale=1,maximum-scale=1,user-scalable=no' /> 
 
    <script src='https://api.tiles.mapbox.com/mapbox-gl-js/v0.40.1/mapbox-gl.js'></script> 
 
    <link href='https://api.tiles.mapbox.com/mapbox-gl-js/v0.40.1/mapbox-gl.css' rel='stylesheet' /> 
 

 
</head> 
 

 
<body> 
 

 
    <div id='map'></div> 
 

 
</body> 
 

 
</html>

+0

P.S:ブラウザコンソールには、次の情報が表示されます。エラー:既にこのIDを持つソースがあります。 –

答えて

1

代わりにソースユーザーがマーカーを追加するたびに新しいレイヤー&を再作成、あなたは一度配線層とそのソースを作成してからちょうど基礎となるデータを更新する必要があります。

mapboxgl.accessToken = 'pk.eyJ1Ijoic3ViaGFtYmFuc3BocyIsImEiOiJjajc4czNxazEyaWE5MnFwaWllNzdwdDdkIn0.6AZVCVM-wGgh5cykoII9kA'; 
 
var map = new mapboxgl.Map({ 
 
    container: 'map', // container id 
 
    style: 'mapbox://styles/mapbox/streets-v9', 
 
    center: [-80.486052, 37.830348], // starting position 
 
    zoom: 5 // starting zoom 
 
}); 
 

 

 
map.on('load',() => { 
 

 
    map.addSource("earthquakes", { 
 
    type: "geojson", 
 
    data: "https://www.mapbox.com/mapbox-gl-js/assets/earthquakes.geojson" 
 
    }); 
 

 
    map.addLayer({ 
 
    id: "markers", 
 
    type: "circle", 
 
    source: "earthquakes", 
 
    paint: { 
 
     "circle-color": "#11b4da", 
 
     "circle-radius": 4, 
 
     "circle-stroke-width": 1, 
 
     "circle-stroke-color": "#fff" 
 
    } 
 
    }); 
 
    
 
    map.addSource('line-source', { 
 
    type: 'geojson', 
 
    data: { 
 
     type: 'FeatureCollection', 
 
     features: [] 
 
    } 
 
    }); 
 
    map.addLayer({ 
 
    type: 'line', 
 
    source: 'line-source', 
 
    id: 'line-layer' 
 
    }); 
 
}); 
 

 
map.on('mouseenter', 'markers',() => { 
 
    map.getCanvas().style.cursor = 'pointer' 
 
}); 
 

 
map.on('mouseleave', 'markers',() => { 
 
    map.getCanvas().style.cursor = 'crosshair' 
 
}); 
 

 
let ground; 
 
let obs; 
 

 
map.on('contextmenu', (f) => { 
 
    ground = [f.lngLat.lng, f.lngLat.lat]; 
 
    
 
    map.getSource('line-source').setData({ 
 
    type: 'FeatureCollection', 
 
    features: [{ 
 
     type: 'Feature', 
 
     geometry: { 
 
     type: 'LineString', 
 
     coordinates: [ground, obs] 
 
     } 
 
    }] 
 
    }) 
 
}); 
 

 

 
map.on('click', 'markers', (e) => { 
 
    obs = [e.lngLat.lng, e.lngLat.lat]; 
 
});
body { 
 
    margin: 0; 
 
    padding: 0; 
 
} 
 

 
#map { 
 
    position: absolute; 
 
    top: 0; 
 
    bottom: 0; 
 
    width: 100%; 
 
} 
 

 
.marker { 
 
    display: block; 
 
    border: none; 
 
    border-radius: 50%; 
 
    cursor: pointer; 
 
    padding: 0; 
 
    background-color: rgba(5, 4, 244, 0.82); 
 
    height: 10px; 
 
    width: 10px 
 
}
<!DOCTYPE html> 
 
<html> 
 

 
<head> 
 
    <meta charset='utf-8' /> 
 
    <title></title> 
 
    <meta name='viewport' content='initial-scale=1,maximum-scale=1,user-scalable=no' /> 
 
    <script src='https://api.tiles.mapbox.com/mapbox-gl-js/v0.40.1/mapbox-gl.js'></script> 
 
    <link href='https://api.tiles.mapbox.com/mapbox-gl-js/v0.40.1/mapbox-gl.css' rel='stylesheet' /> 
 

 
</head> 
 

 
<body> 
 

 
    <div id='map'></div> 
 

 
</body> 
 

 
</html>

あなたのスニペットを簡略化しましたが、その要点を得るべきです。

+0

ありがとうございます!はい、これはもっときれいに見えます。最後の右クリックまで生成されたすべての行を表示できますか?ここでは同じIDのエラーは解決されますが、私は最後の点のペアを結ぶ線を見ることができます。可能であれば最後の右クリックまで生成されたすべての行を表示したいと思います。 @Scarysize –

+0

作成するLineStringジオメトリに座標を追加することができます。座標は少なくとも2つ必要です。 – Scarysize

+0

[trueArray [i]、obsArray [i]]ここで、これらの2つは左クリック座標と右クリック座標を格納する配列で、truthArrayのサイズをループしたものです。しかし私は私の望む結果を得られません。左クリックポイントと右クリックポイントの間のすべての線が表示されるように別の方法でそれらを追加する必要がありますか? @Scarysize –

関連する問題