用Python解压Bing地图地理数据(边界)
我一直在尝试使用Python解压Bing地图位置/边界形状算法。我的最终目标是通过合并多个县和市创建自定义区域/边界,并将位置数据保存到我们的数据库中,以便进行更快、更准确的基于位置的分析 我的策略如下,但我有点被#2卡住了,因为我似乎无法准确地解压缩代码:用Python解压Bing地图地理数据(边界),python,algorithm,bing-maps,Python,Algorithm,Bing Maps,我一直在尝试使用Python解压Bing地图位置/边界形状算法。我的最终目标是通过合并多个县和市创建自定义区域/边界,并将位置数据保存到我们的数据库中,以便进行更快、更准确的基于位置的分析 我的策略如下,但我有点被#2卡住了,因为我似乎无法准确地解压缩代码: 从中检索县/市边界-他们将其称为“形状” 解压缩他们的“形状”数据,以获得边界点的纬度和经度 删除与其他形状具有相同lat/lng的点(目标是制作多个县的一个大型形状,而不是5-6个单独的形状) 压缩最终结果并保存在数据库中 我使用的函数似
#根据“安全字符”的相应索引分配每个字符的编号
#32以下的数字表示它是该点组合的最后一个数字,并开始一个新点
对于压缩数据中的字符:
num=Decimal(safeCharacters.index(char))
如果num<32:
point.append(num)
pointsArray.append(点)
点=[]
其他:
num-=十进制数(32)
point.append(num)
#循环通过每个点,以确定每个点的lat/lng
对于pointsArray中的pnt:
结果=十进制(0)
#这是点压缩算法的第7步https://msdn.microsoft.com/en-us/library/jj158958.aspx
对于反转中的数值(pnt):
如果结果==0:
结果=num
其他:
结果=结果*十进制数(32)+num
#这在很大程度上来自于当时的解压缩算法(不是Python格式)https://msdn.microsoft.com/en-us/library/dn306801.aspx
#确定它在哪个诊断仪上
diag=Decimal(整数(四舍五入((8*结果+5)-1)/2)))
#从下对角线中提取总点数,并从剩余部分中获取X和Y
latY=十进制(结果-十进制(diag*(diag+1)/2))
lngX=十进制(诊断)
#撤消符号编码
如果板条%2==1:
板条=(板条+十进制(1))*十进制(-1)
如果lngX%2==1:
lngX=(lngX+十进制(1))*十进制(-1)
latY/=2
lngX/=2
#撤消增量编码
车床=车床+最后车床
液化天然气=液化天然气+最后液化天然气
lastLat=lat
lastLng=液化天然气
#定位小数点
lat/=十进制(100000)
液化天然气/=十进制(100000)
#以字符串格式(与十进制格式相反)将点附加到latLng列表
latLng.append([str(lat),str(lng)])
返回板条
压缩算法:
1440iqu9vJ957r8pB——SYB6RH——NTQB56SK2B2NQ07MWVQ5F64R0M0FNI11OOE4KKKVXEY4WZMUOTR——DvsiqvFozvt-Lw9znxH-R5OxLV9YXHH7WKNK4SB8O0RVV56D8SNW5N1JBG50K4K4PLCLKPQBPGL9F4H4X——SJMS856QQQQF9F4QBR188MBQK-PQXX5X5X5X5X5E9F4X5F4X4X4X8YGIOU
这是结果:
[41.46986'、-87.79031'、[41.47033'、-87.52569'、[41.469145',
'-87.23372'], ['41.469395', '-87.03741'], ['41.41014', '-86.7114'],
['41.397545', '-86.64553'], ['41.3691', '-86.47018'], ['41.359585',
'-86.41984'], ['41.353585', '-86.9637'], ['41.355725', '-87.43971'],
['41.35561', '-87.52716'], ['41.3555', '-87.55277'], ['41.354625',
'-87.63504'], ['41.355635', '-87.54018'], ['41.360745', '-87.40351'],
['41.362315', '-87.29262'], ['41.36214', '-87.43194'], ['41.360915',
'-87.44473'], ['41.35598', '-87.58256'], ['41.3551', '-87.59025'],
['41.35245', '-87.59828'], ['41.34782', '-87.60784'], ['41.34506',
'-87.61664'], ['41.34267', '-87.6219'], ['41.34232', '-87.62643'],
['41.33809', '-87.63286'], ['41.33646', '-87.63956'], ['41.32985',
'-87.65056'], ['41.33069', '-87.65596'], ['41.32965', '-87.65938'],
['41.33063', '-87.6628'], ['41.32924', '-87.66659'], ['41.32851',
'-87.71306'], ['41.327105', '-87.75963'], ['41.329515', '-87.64388'],
['41.32698', '-87.73614'], ['41.32876', '-87.61933'], ['41.328275',
'-87.6403'], ['41.328765', '-87.63857'], ['41.32866', '-87.63969'],
[41.32862',-87.70802']
不能将Bing Maps GeoData API中的边界数据或从中派生的任何数据存储在数据库中。这违反了平台的使用条款。正如rbrundritt所提到的,存储来自大地图的数据违反了使用条款。然而,同样的数据还有其他来源,例如 为了解决这个问题,并且为了更有效地存储这个和其他坐标数据,我在计算“diag”时删除了“round”函数,从而解决了这个问题。这应该是它的替代品:
diag = int((math.sqrt(8 * result + 5) - 1) / 2)
我添加的所有“十进制”垃圾都不是必需的,所以如果你愿意,你可以删除它 你也可以这样做
diag=int(round((sqrt(8 * number + 1)/ 2)-1/2.))
别忘了用纬度减去经度*2,得到N/E坐标 也许会
diag = int((math.sqrt(8 * result + 5) - 1) / 2)
diag=int(round((sqrt(8 * number + 1)/ 2)-1/2.))
diag = math.floor((math.sqrt(8 * result + 1) - 1) / 2)