使用此代码将信息传输到 map :
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
})
})
}
但它返回未定义的值,并且 map 上没有出现图像。
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]
不嵌套属性:
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 可能具有与传入数据同名的属性,因此我们可以将要加入的所有属性作为 join 的子属性放置。
对于您的数据,整个操作可能如下所示:
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);
该代码段假定 geojson 中的 local
(在 json 中)和 NOME
是执行连接时使用的唯一值。
关于javascript - 传单中的 geojson 和 json 无法连接在一起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47510426/