Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Python解压Bing地图地理数据(边界)_Python_Algorithm_Bing Maps - Fatal编程技术网

用Python解压Bing地图地理数据(边界)

用Python解压Bing地图地理数据(边界),python,algorithm,bing-maps,Python,Algorithm,Bing Maps,我一直在尝试使用Python解压Bing地图位置/边界形状算法。我的最终目标是通过合并多个县和市创建自定义区域/边界,并将位置数据保存到我们的数据库中,以便进行更快、更准确的基于位置的分析 我的策略如下,但我有点被#2卡住了,因为我似乎无法准确地解压缩代码: 从中检索县/市边界-他们将其称为“形状” 解压缩他们的“形状”数据,以获得边界点的纬度和经度 删除与其他形状具有相同lat/lng的点(目标是制作多个县的一个大型形状,而不是5-6个单独的形状) 压缩最终结果并保存在数据库中 我使用的函数似

我一直在尝试使用Python解压Bing地图位置/边界形状算法。我的最终目标是通过合并多个县和市创建自定义区域/边界,并将位置数据保存到我们的数据库中,以便进行更快、更准确的基于位置的分析

我的策略如下,但我有点被#2卡住了,因为我似乎无法准确地解压缩代码:

  • 从中检索县/市边界-他们将其称为“形状”
  • 解压缩他们的“形状”数据,以获得边界点的纬度和经度
  • 删除与其他形状具有相同lat/lng的点(目标是制作多个县的一个大型形状,而不是5-6个单独的形状)
  • 压缩最终结果并保存在数据库中
  • 我使用的函数似乎适用于文档中提供的“vx1vilihnM6hR7mEl2Q”示例。然而,当我插入一些更复杂的东西时,比如库克县,公式似乎不适用(通过将几个点插入到同样使用Bing贴图的不同多边形贴图/绘图应用程序中进行测试)。它基本上在芝加哥的南面形成了一条直线,该直线向东和向西延伸到印第安纳州,没有太多的南北运动。在不知道任何一个县的实际坐标应该是多少的情况下,我不知道如何找出我的错误所在

    我们非常感谢您的帮助,即使这是一个不同策略的建议

    以下是python代码(对于过度使用十进制格式,我深表歉意-我在确保错误不是由于无意中丢失精度而导致的错误方面做得很差):

    def解码边界(压缩数据): latLng=[] pointsArray=[] 点=[] lastLat=十进制(0) lastLng=十进制(0)

    #根据“安全字符”的相应索引分配每个字符的编号
    #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)