Топойсон, добавляющий внешние свойства без видимого контекста - PullRequest
1 голос
/ 30 марта 2019

Цель состоит в том, чтобы добавить внешние свойства к топойсону. Мне удалось преобразовать шейп-файлы из http://www.diva -gis.org / gdata для разных стран в файлы json. Я также преуспел в том, чтобы уменьшить выборку этих файлов до более дружественного размера файла. Как это:

shp2json CHN_adm0.shp --out CHN_adm0.json
geo2topo CHN_adm0.json > china.json
shp2json CHN_adm1.shp --out CHN_adm1.json
geo2topo CHN_adm1.json > china.json
toposimplify -s 1e-9 -f < china.json > china-topo.json
toposimplify -s 1e-9 -f < china1.json > china1-topo.json

Затем я объединил полигоны уровня страны с полигонами уровня провинции. И, возможно, именно здесь я мог бы добавить внешние свойства, если это правильно, но, как вы увидите, у меня может быть дополнительное препятствие:

geo2topo regions=CHN_adm1.json country=CHN_adm0.json > china-regions-topo.json
toposimplify -s 1e-9 -f < china-regions-topo.json > china-regions.json

На данном этапе я не уверен, как добавить свойства к данным из diva-gis. Вот пример фрагмента dict / object и соответствующих ключей того, что в итоге получилось в моем China-region.json (примечание: я использую python для изучения файла json, но на самом деле я не собираюсь использовать python для чего-либо еще вопрос):

len(json['objects']['regions']['geometries'])
>> 31 ## 31 provinces in China

json_data['objects']['regions'].keys()

>> dict_keys(['type', 'bbox', 'geometries']) ## seems like there is nothing to map to, like an id or province name

Вопрос

Как добавить внешние свойства к топойсонам, которые я преобразовал из шейп-файлов из diva-gis? Похоже, что нечего сопоставлять. Я даже не могу сказать, какая провинция какая после изучения данных; это просто список дуг, которые достаточно хорошо изображены на карте, но для человека нет ничего интуитивно понятного, чтобы определить, какая провинция какая.

Дополнительные пояснения:

  • Формат внешнего свойства произвольный; просто представьте CSV с названием провинции и номером, скажем, население провинции.
  • Не против использования смазки для локтей, но я бы хотел избежать проб и ошибок в максимально возможной степени
  • Порядок областей в файле json неизвестен. Не уверен, будет ли diva-gis придерживаться какого-либо конкретного соглашения (в алфавитном порядке и т. Д.)

1 Ответ

0 голосов
/ 03 апреля 2019

Ваш близок к поиску идентификатора - обычно это внуки каждой геометрии:

topojson.objects.regions[n].geometry.properties.property // where property is a column in the original shapefile.

С shp2json вы не можете использовать --geometry или --ignore-properties, иначе вы проигнорируете файл dbf. Файл dbf содержит свойства каждой функции

Эти свойства являются столбцами таблицы атрибутов шейп-файла. Если у вас здесь ничего нет, вы не включили файл dbf, который содержит эти данные, как часть процесса преобразования.

С помощью всего лишь javascript я мог бы получить список свойств каждой геометрии:

    // Get the geometries:
    var regions = data.objects.regions.geometries;

    // List of properties present (in first element anyways):
    console.log(Object.keys(regions[0].properties));

И чтобы добавить новые свойства, используя javascript и метод карты d3, я мог бы использовать:

    // Create a map to look up regions:
    var map = d3.map(regions, function(d) { return d.properties.NAME_1; });

    // Get by Name_1:
    console.log(map.get("ExampleName"));        

    // New data to join to topojson:
    var dataToAttach = [
        { region: "A", capital: "X" },
        { region: "B", capital: "Y" },
        { region: "C", capital: "Z"}  //...
    ]

    // Add new property:
    dataToAttach.forEach(function(d) {
      map.get(d.region).capital = d.capital;
    })

Самая распространенная проблема здесь заключается в том, что идентификаторы не будут точно совпадать или вообще не совпадать с табличными данными, которые вы хотите присоединить к нему, для этого часто требуется обработка.

Вот реализация вышеописанного (хотя и в клиенте), использующая и добавляющая данные в топойсон, созданный из данных DivA GIS.

...