今天的课题则是在获取经纬坐标的情况下,如何进行省市定位问题。
1. 坐标系
首先需要先对坐标系进行一个交单的介绍。现在的坐标系包含了:
- 火星坐标系
- 地球坐标系
- 百度坐标系
通过同一个经纬度(116.404, 39.915)在百度以及高德进行定位,可以发现他们明显存在偏移,则说明他们使用的坐标系并不一样。
- 地球坐标(WGS84):这是国际公认的标准坐标系。
- 火星坐标(GCJ-02):这是一种国家保密插件,将COM口读出来的真实的坐标信号,加密转换成国家要求的保密的坐标。
- 百度坐标(DB-09):百度自己的加密。
关于坐标系之间的转换可以参考坐标转换
2. 坐标定位
import json
import os
def isPointinPolygon(point, rangelist, apices): #[[0,0],[1,1],[0,1],[0,0]] [1,0.8]
# # 判断是否在外包矩形内,如果不在,直接返回false
maxlng = apices["maxlng"]
minlng = apices["minlng"]
maxlat = apices["maxlat"]
minlat = apices["minlat"]
# print(maxlng, minlng, maxlat, minlat)
if (point[0] > maxlng or point[0] < minlng or
point[1] > maxlat or point[1] < minlat):
return False
for range_i in rangelist:
if In(point, range_i):
return True
return False
def In(point, rangelist):
if len(rangelist) < 3:
return False
a = rangelist[0]
res = rayIntersectsSegment(point, rangelist[len(rangelist)-1], a)
for b in rangelist[1:]:
if rayIntersectsSegment(point, a, b):
res = not res
a = b
return res
def rayIntersectsSegment(point, a, b):
return (a[1] > point[1]) != (b[1] > point[1]) and point[0] < (b[0] - a[0])*(point[1] - a[1])/(b[1]- a[1])+a[0]
def loadOriginalJson(filename):
fin = open(filename, encoding= "utf-8")
data_json = json.load(fin)
return data_json
def Orientation(point):
provice_name = ""
city_name = ""
file_path = "provices2/行政区划范围2.json"
data_json = loadOriginalJson(file_path)
for provice in data_json["provice"]:
if isPointinPolygon(point, provice["coordinates"], provice["apices"]):
provice_name = provice["name"]
for city in provice["subordinate"]:
if isPointinPolygon(point, city["coordinates"], city["apices"]):
city_name = city["name"]
return provice_name, city_name
if __name__ == "__main__":
# processProvice()
print(Orientation([105.344513,27.622377]))
高德定位结果
代码定位结果