Карта Geojson с D3 отображает только один путь в коллекции объектов - PullRequest
0 голосов
/ 01 марта 2019

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

enter image description here

В моей коллекции объектов 52 функции, но я могу нарисовать только одну эту функцию.Я не знаю, что я делаю неправильно, я основываю свой код на других уроках.Как я могу сделать, чтобы показать все пути?

var features = mapData.features;
console.log(features);
// Update color scale domain based on data
// Draw each province as a path
 mapLayer.selectAll('path')
  .data(features)
 .enter().append('path')
  .attr('d', path)
  .attr('vector-effect', 'non-scaling-stroke')

Вот мой полный код:

https://plnkr.co/edit/kSDtyyoWr9TSEDZ5Letv?p=preview

Ответы [ 3 ]

0 голосов
/ 01 марта 2019

Задача

Все ваши объекты прорисованы, вы правильно используете свой путь и вводите цикл.Чтобы увидеть, установите для своей заливки значение none:

enter image description here

Вы можете увидеть их при проверке svg: все пути есть.

Почему вы не видите их на карте, когда они заполнены?Поскольку полигоны перевернуты, они охватывают весь мир, за исключением области интереса.В то время как большинство других географических библиотек / средств визуализации воспринимают геойсон как декартову, D3 - нет.Это означает, что порядок намотки имеет значение.Ваши координаты намотаны в неправильном порядке.

Решение

Чтобы правильно заполнить, нарисовать все объекты и поддерживать взаимодействие с мышью, необходимо изменить порядок намотки полигонов.Вы можете сделать это на лету или создать новые файлы geojson для хранения предварительно обращенных данных.

Для этого давайте взглянем на ваши данные.Вы работаете только с мультиполигонами, давайте рассмотрим структуру:

{ 
  type:"Feature",
  properties: {...},
  geometry: {
    type: "MultiPolygon",
    coordinate: /* coordinates here */
  }
}

Координаты структурированы следующим образом:

 coordinates:[polygons] // an array of polygons

Отдельные полигоны структурированы следующим образом:

 [outer ring][inner ring][inner ring]... // an array of coordinates for an outer ring, an array of coordinates for each hole (inner ring).

Полигональные кольца структурированы в виде массива длинных лат, причем первое и последнее значения одинаковы.

[x,y],[x,y]....

Итак, чтобы изменить порядок координат, нам нужнопоменять местами элементы в кольцевых массивах:

 features.forEach(function(feature) {
   if(feature.geometry.type == "MultiPolygon") {
     feature.geometry.coordinates.forEach(function(polygon) {
       polygon.forEach(function(ring) {
         ring.reverse(); 
       })
     })
   }
 })

Если бы в миксе тоже были полигоны (они немного меньше вложены), мы могли бы использовать:

 features.forEach(function(feature) {
   if(feature.geometry.type == "MultiPolygon") {
     feature.geometry.coordinates.forEach(function(polygon) {

       polygon.forEach(function(ring) {
         ring.reverse();
       })
     })
   }
   else if (feature.geometry.type == "Polygon") {
     feature.geometry.coordinates.forEach(function(ring) {
       ring.reverse();
     })  
   }
 })

Вот обновленный plunker

0 голосов
/ 02 сентября 2019

Если кто-то увидит подобную проблему, я создал инструмент, который поможет вам rewind или reverse geojson

https://observablehq.com/@bumbeishvili/rewind-geojson

Вы можете запустить его как фрагменттолько ниже

<div class="notebook-content">
  
</div>

<script type="module"> 

import notebook from "https://api.observablehq.com/@bumbeishvili/rewind-geojson.js";  //  "download code" url

document.querySelector('.notebook-content').innerHTML =notebook.modules[0].variables
.filter(d=>d)
.map((d,i)=>` <div class=" observable-wrapper div-number-${i}"></div>`)
.join('')
.concat('<div style="display:none" class="hidden"></div>')


import {Inspector, Runtime} from "https://unpkg.com/@observablehq/runtime@3/dist/runtime.js"; 
let i=1;
Runtime.load(notebook, (variable) => { 
if(i==4 ){i++;  return new Inspector(document.querySelector(`.hidden`));}
if(i==13)return;
return new Inspector(document.querySelector(`.observable-wrapper:nth-child(${i++})`));
 }); 


</script>
0 голосов
/ 01 марта 2019

Рисует все пути.См. DOM для SVG в инспекторе веб-страниц для подтверждения.Тем не менее, вы видите только верхнюю часть, которая оказывается большей площадью из-за заливок.Попробуйте добавить .style('fill', 'none') к добавлению путей в JS.или следующее в CSS

path {
  fill: none
}
...