Используйте этот код для передачи информации на карту:
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" }]
Кто-то знает, что я могу делать неправильно, можете ли вы мне помочь?
Вы можете взять свой массив и использовать его для создания карты, чтобы вы могли искать/словарные значения с помощью идентификатора (ключа). Структура данных, в которой вы были бы:
От:
[{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 - это уникальные значения, с которыми должно выполняться соединение.
+
перед dataHash?