前言
有一个工具。
能够在线编辑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)