Не могу объединиться между геойсон и Джонс в листовке

1

Используйте этот код для передачи информации на карту:

function join(){            
    $.when(
        $.getJSON('bairro.json'),
        $.getJSON('convertJson.php')
    ).done(function(responseGeojson, responseData) {
        var data = responseData[0]
        var geojson = responseGeojson[0]

        // Create hash table for easy reference
        var dataHash = {}
        console.log('==data==');
        console.log(data);
        data.forEach(function(item) {
            if(item.cod) 
            dataHash[item.cod] = item.cod;
            if(item.nome) 
            dataHash[item.nome] = item.nome;
            if(item.local) 
            dataHash[item.local] = item.local;

        })
        // Add value from hash table to geojson properties
        geojson.features.forEach(function(item) {
            console.log('-->' + dataHash[item.properties.nome]);
            item.properties.Codigo = +dataHash[item.properties.cod]   || null
            item.properties.Nome   = +dataHash[item.properties.nome]  || null
            item.properties.Local  = +dataHash[item.properties.local] || null

        })

    })
}

Но он возвращает неопределенные значения, и на карте не появляется изображение.

Geojson выглядит так:

{"type": "FeatureCollection",
"features": [
{ "type": "Feature", "properties": { "NOME": "local1", "REGIAO_ADM": "value1", "CODBAIRRO": "13"}, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 694555.509827277157456, 7483079.800010865554214 ], [ 694554.849827276892029, 7483077.34010686352849 ], [ 694551.869923274731264, 7483076.470026861876249 ],...}
{ "type": "Feature", "properties": { "NOME": "local2", "REGIAO_ADM": "value2", "CODBAIRRO": "13"}, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 694555.509827277157456, 7483079.800010865554214 ], [ 694554.849827276892029, 7483077.34010686352849 ], [ 694551.869923274731264, 7483076.470026861876249 ],...}
{ "type": "Feature", "properties": { "NOME": "local3", "REGIAO_ADM": "value3", "CODBAIRRO": "13"}, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 694555.509827277157456, 7483079.800010865554214 ], [ 694554.849827276892029, 7483077.34010686352849 ], [ 694551.869923274731264, 7483076.470026861876249 ],...}

JSON выглядит так:

[{ "cod": "13", "local": "local1", "nome": "value1" }, { "cod": "98", "local": "local2", "nome": "value2" }, { "cod": "97", "local": "local3", "nome": "value3" }]

Кто-то знает, что я могу делать неправильно, можете ли вы мне помочь?

  • 0
    почему у вас есть символ + перед dataHash?
Теги:
leaflet
dictionary
join

1 ответ

0
Лучший ответ

Вы можете взять свой массив и использовать его для создания карты, чтобы вы могли искать/словарные значения с помощью идентификатора (ключа). Структура данных, в которой вы были бы:

От:

[{id:"A",property:"value1"},{id:"B",property:"value2"}, .... ]

Для того, чтобы:

{A:{id:"A",property:"value1"},B:{id:"B",property:"value2"}, .... }

Теперь, чтобы найти свойства объекта A, нам нужно только получить доступ к этому свойству.

В настоящее время код не поддерживает связь между ключами и значениями. Он принимает значения свойств и создает массив со свойствами, которые имеют значение, равное имени свойства:

dataHash[item.cod] = item.cod;

Если item.cod равен "foo", то тогда dataHash.foo == "foo". dataHash[item.cod] не dataHash[item.cod] свойства:

var data = [{cod:1,nome:2,local:3},{cod:4,nome:5,local:6}]
        
        var dataHash = {};
        data.forEach(function(item) {
            if(item.cod) 
            dataHash[item.cod] = item.cod;
            if(item.nome) 
            dataHash[item.nome] = item.nome;
            if(item.local) 
            dataHash[item.local] = item.local;
        })
        
console.log(dataHash);

Есть много способов выполнить то, что вы хотите, но для ваших данных при создании словаря код может выглядеть примерно так (предполагая, что имена свойств (не значения) начинаются с числа):

    var lookup = {};
    data.forEach(function(item) {
        if(item.id) {
          lookup[item.id] = {
            id: item.id,
            property1: item.property1,
            property2: item.property2,
            property3: item.property3
          }   
        }
      })

Хотя, конечно, если вы хотите, чтобы все свойства были внесены в словарь, вы можете использовать:

    var lookup = {};
    data.forEach(function(item) {
        if(item.id) {
          lookup[item.id] = item
        }
      })

Это не предполагает дублирования записей в ваших данных

var data = [
 {id:"id1",property1:"text1",property2:"text2",property3:"text3"}, 
 {id:"id2",property1:"textA",property2:"textB",property3:"textC"}];
       
        var lookup = {};
        data.forEach(function(item) {
            if(item.id) {
              lookup[item.id] = {
                id: item.id,
                property1: item.property1,
                property2: item.property2,
                property3: item.property3
              }            
            }
        })
        
console.log(lookup)

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

  geojson.features.forEach(function(item) {
            if(lookup([item.properties.id])) {
                item.properties.joined = lookup[item.properties.id]
            }
        })

Поскольку geojson может иметь свойства с тем же именем, что и входящие данные, мы можем поместить все свойства, которые мы объединяем, в качестве подзадача присоединенного.

Для ваших данных вся операция может выглядеть так:

var geojson = {"type": "FeatureCollection",
"features": [
{ "type": "Feature", "properties": { "NOME": "local1", "REGIAO_ADM": "value1", "CODBAIRRO": "13"}},
{ "type": "Feature", "properties": { "NOME": "local2", "REGIAO_ADM": "value2", "CODBAIRRO": "13"}},
{ "type": "Feature", "properties": { "NOME": "local3", "REGIAO_ADM": "value3", "CODBAIRRO": "13"}}
  ]}
  
var data = [{ "cod": "13", "local": "local1", "nome": "value1" }, { "cod": "98", "local": "local2", "nome": "value2" }, { "cod": "97", "local": "local3", "nome": "value3" }]


var lookup = {};
data.forEach(function(item) {
  if(item.local) {
     lookup[item.local] = item;            
    }
})

geojson.features.forEach(function(d) {
  if (lookup[d.properties.NOME]) {
     d.properties.joined = lookup[d.properties.NOME];
  }
})

console.log(geojson);

Фрагмент предполагает, что local (в json) и NOME в geojson - это уникальные значения, с которыми должно выполняться соединение.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню