共计 1733 个字符,预计需要花费 5 分钟才能阅读完成。
前言
有一个工具。
能够在线编辑 geojson 数据。
次要性能是,在线编辑修建,增删改,次要数据是面积和高度。面积由轨迹数组组成。
轨迹数组:features.geometry.coordinates。
高度是:features.properties.Height。
编辑了能够导出成一份 geojson 文件,也可导出成 obj 文件。
明天遇到的问题是,如果我想晓得我编辑了多少个修建,怎么办?
通过
原则上能够在编辑的过程中记录,但这样做不是很好。
- 曾经改了的文件,没方法重新处理
- 减少工作量
- 减少逻辑解决,影响性能
过程
- 最简略的办法是,间接应用 for 循环,遍历两份数据,如果可能找到雷同的数据,即是未修改,否则批改 +1.
- 然而这样做有两个问题。
- 因为精度问题,导入的原始数据和导出的数据,就算没扭转,也会有差别,因为小数点足足有 14 位。
- 间接循环工夫复杂度是 O(n2)。
怎么办呢?
通过测试,发现两份数据在保留 4 位小数点的时候,是统一的。
所以能够把数据取 4 个小数点。
数据差别的问题曾经解决了。
然而工夫复杂度还没解决。
于是决定用空间换工夫。
算法
用一个对象,把每一个修建的轨迹存储到哈希之中,哈希的值为修建的高度。
如:
features.properties.Height = 9
features.geometry.coordinates = [[[114.35098683912278, 36.13595280429963],[114.35098693920013, 36.13582170962971]]]
则存储为:
let obj = {}
obj[‘114.3509-36.1359-114.3509-36.1358’] = 9
因为不同修建的高度、轨迹不同,所以同一份数据的哈希是惟一的。
第一份数据存储起来,跟第二份数据比拟,记录下不雷同的数据,就能够找到扭转的数据。
备注
为了防止哈希反复,在记录哈希的时候须要做一个反复判断。
附录
import gai from './assets/gai.js'
import yuan from './assets/yuan.js'
let gaiobj = {}
let yuanobj = {}
for(let i = 0; i < yuan.features.length; i++){let features = yuan.features[i]
let properties = features.properties
let geometry = features.geometry
let coordinates = geometry.coordinates[0]
let lnglat = coordinates[0]
let height = Number(properties.Height || properties.height)
let key = ''
lnglat.forEach(xy => {let [x, y] = xy
key += x.toFixed(4) + '-'+ y.toFixed(4) + '-'
})
if(yuanobj[key]){console.log('key1', key)
}
yuanobj[key] = height
}
let change = 0
for(let i = 0; i < gai.features.length; i++){let features = gai.features[i]
let properties = features.properties
let geometry = features.geometry
let coordinates = geometry.coordinates[0]
let lnglat = coordinates[0]
let height = Number(properties.Height || properties.height)
let key = ''
lnglat.forEach(xy => {let [x, y] = xy
key += x.toFixed(4) + '-'+ y.toFixed(4) + '-'
})
if(gaiobj[key]){console.log('key2', key)
}
gaiobj[key] = height
if(yuanobj[key] != gaiobj[key]){change ++}
}
console.log('曾经扭转了的修建:', change)
正文完
发表至: javascript
2020-09-25