所以我正在解析一个有地址对象的csv文件。然后我想把这个地址发送到另一个我去过的网站上获取地址的lat / lng。然后我希望该函数返回lat / lng并将其添加为数组中location对象的子对象。
到目前为止,我正在解析CSV并拔出地址对象。我有能够发送地址并获得lat / lng的功能....但我不知道如何优雅地将它们链接在一起。我想我只能做一个巨大的功能,但我想让它变得更干净。
我的事件数组看起来像这样:
reportType: 'OFFENSE 2.0',
reportNumber: '15021912',
offense: '3301',
description: 'Driving on Right Side of Roadway.',
dateTime: '02/06/2015',
location:
{ block: '02:03 Greentree Rd & Mansfield Ave',
zone: 'Outside City' },
person: { age: 'OSC', sex: 'N/A' } }
CSV解析代码就在这里。
function makeURL() {
var date = new Date();
var today = date.getDay();
var day = daysOfTheWeek[today];
link = 'http://apps.pittsburghpa.gov/police/arrest_blotter/arrest_blotter_' + day + '.csv'
return link
}
var url = makeURL();
function getURL() {
http.get(url, function(res) {
if(res.statusCode === 200) {
res.pipe(parser);
} else {
console.error('The address is unavailable. (%d)', res.statusCode);
}
})
}
var parser = parse(function(err, data) {
for(i = 1; i < data.length; i++) {
var info = data[i]
if(info[7] === 'OSC') {
info[7] = 'Outside City Limits'
}
if(info[9] === '') {
info[9] = 'N/A'
}
if(info[8] === '') {
info[8] = 'N/A'
}
var incident = {
reportType: info[0],
reportNumber: info[1],
offense: info[2],
description: info[3],
dateTime: info[4],
location: {
block: info[5] + " " + info[6],
zone: info[7],
},
person: {
age: info[8],
sex: info[9]
}
}
var passLoc = info[5];
passLoc = passLoc.replace('block ','')
passLoc = passLoc.replace(/ /g,"+")
console.log(incident);
// console.log(passLoc);
}
});
获取Lat / lng的代码在这里:
function getLoc() {
for(i = 0; i < locy.length; i++) {
var address = locy[i]
var url = "http://geodata.alleghenycounty.us/arcgis/rest/services/Geocoders/EAMS_Composite_Loc/GeocodeServer/findAddressCandidates?Street=" + address + "&City=Pittsburgh&State=PA&ZIP=&SingleLine=&outFields=&outSR=4326&searchExtent=&f=pjson";
http.get(url, function(res) {
var data = '';
res.on('data', function(chunk) {
data += chunk;
});
res.on('end', function() {
var d = JSON.parse(data);
var obj = d.candidates;
if(obj != '') {
var loc = obj[0].location
var location = {
lat: loc.x,
lng: loc.y
}
return location
} else {
return address
}
});
res.on('error', function(err) {
console.log("error!")
});
});
}
}
如果有更好的方法可以做到这一点,我不会考虑总是愿意学习。
答案 0 :(得分:0)
您的位置对象到底是什么样的?这有点黑客,但关联数组/字典可能会帮助你。
假设您制作了一些位置对象(在Chrome的开发控制台中完成,因此您可以看到每个语句返回的内容)。
首先创建一个位置对象:
place1 = {}
>Object {}
place1.name = "SomePlace"
>"SomePlace"
place1.address = "123 Sesame St."
>"123 Sesame St."
然后,为了更好的衡量,创建另一个:
place2 = {}
>Object {}
place2.name = "AnotherPlace"
>"AnotherPlace"
place2.address = "456 Main St."
>"456 Main St."
现在,让您的locy
数组保留这些位置:
locy = []
>[]
locy.push(place1)
>1
locy
>[Object]
locy.push(place2)
>2
locy[1]
>Object {name: "AnotherPlace", address: "456 Main St."}
现在,您可以直接附加到这些对象:
locy[1].lat = 35
>35
locy[1]
>Object {name: "AnotherPlace", address: "456 Main St.", lat: 35}
因此,在您的情况下,只需使用此类对象填充locy
,并将其传递到getLoc()
函数中。然后,您仍然可以使用for循环对其进行迭代,并将lat / lon数据与您的locy[i]
或address
变量相关联。