我用 nodejs-v8.15.0 和 tilestrata-2.1.2 搭建了一个地图服务,现在在调试 geojson 的输出,遇到一个诡异的问题。 我的后端代码如下:
query=`SELECT ST_ASGEOJSON(ST_INTERSECTION( ST_TRANSFORM(ST_SETSRID(way, 900913),4326) , ST_SETSRID(ST_MAKEENVELOPE(121.5966796875,31.12819929911195,121.61865234375,31.109388560814956), 4326) ) ) AS geometry, tags AS properties FROM planet_osm_roads WHERE ST_INTERSECTS( ST_TRANSFORM(ST_SETSRID(way, 900913),4326), ST_SETSRID(ST_MAKEENVELOPE(121.5966796875,31.12819929911195,121.61865234375,31.109388560814956), 4326) ) AND highway <> ''`;
pgPool.query(query, function(err, result) {
if (err) {
console.log(query, err.message, err.stack)
var err = new Error('An error occurred');
err.statusCode = 500;
return callback(err);
}
var outputText = '{"type":"FeatureCollection","features":[' +
result.rows.map(function(row) {
if (row.geometry) {
var featureString = '{"type":"Feature","geometry":' + row.geometry;
if (row.properties != ''){
var rowpro = row.properties;
rowpro = rowpro.replace(/=>/g,':');
featureString = featureString + ',"properties":' + '{'+ rowpro + '}}';
}
else{
featureString = featureString + ',"properties":""}';
}
delete row;
return featureString;
}
}).join(',') +']}';
//在此处的 outputText 得到的数据是完整的,总共 4372 个字符,也是可以正常解析的
callback(null, outputText, {'Content-Type': 'application/json'});
});
然后在浏览器中输入 http://192.168.56.180:8767/geojson/14/13726/6700/road.json 你会发现 head 中的 Content-Length 是 4372,但 RAW DATA 中只显示了 4324 个字符,后面的消失了,导致报错:SyntaxError: JSON.parse: unterminated string at line 1 column 4325 of the JSON data
并不是所有的语句都会被截断,但有些就会这样,如果我把 row.properties 这部分代码去除则不会出错,但是加了 row.properties 这部分代码后生成的 outputText 是正确的,一到浏览器那就可能出错,我找不出规律
附:数据来源是 openstreetmap 下载的 shanghai 的 pbf,此问题在我这是可以复现的,浏览器是 chrome-71.0.3578.80 ( 64 位)和 firefox-63.0.3 (64 位),数据是用 osm2pgsql 导入的。
请各位大虾指点迷津,我已经没方向了
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.