通过经纬度坐标进行定位服务(省市)【python实现】

今天的课题则是在获取经纬坐标的情况下,如何进行省市定位问题。

1. 坐标系

首先需要先对坐标系进行一个交单的介绍。现在的坐标系包含了:

  1. 火星坐标系
  2. 地球坐标系
  3. 百度坐标系

通过同一个经纬度(116.404, 39.915)在百度以及高德进行定位,可以发现他们明显存在偏移,则说明他们使用的坐标系并不一样。

高德搜索

百度搜索

  1. 地球坐标(WGS84):这是国际公认的标准坐标系。
  2. 火星坐标(GCJ-02):这是一种国家保密插件,将COM口读出来的真实的坐标信号,加密转换成国家要求的保密的坐标。
  3. 百度坐标(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]))

高德定位结果
在这里插入图片描述

代码定位结果
在这里插入图片描述

关注公众号回复关键字【省市范围json】,即可下载全国各区市边界范围文件。

在这里插入图片描述

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
要通过Python经纬度坐标生成矢量面文件,您可以使用GDAL库来实现。下面是一个示例代码,可以将经纬度坐标转换为矢量面并保存为Shapefile文件: ```python from osgeo import ogr # 创建Shapefile数据源 driver = ogr.GetDriverByName('ESRI Shapefile') data_source = driver.CreateDataSource('output.shp') # 创建图层 layer = data_source.CreateLayer('polygon', geom_type=ogr.wkbPolygon) # 创建字段 field_defn = ogr.FieldDefn('id', ogr.OFTInteger) layer.CreateField(field_defn) # 创建多边形 ring = ogr.Geometry(ogr.wkbLinearRing) # 添加经纬度坐标点 ring.AddPoint(lon1, lat1) ring.AddPoint(lon2, lat2) ring.AddPoint(lon3, lat3) # ...添加更多的点... # 创建多边形对象 polygon = ogr.Geometry(ogr.wkbPolygon) polygon.AddGeometry(ring) # 创建要素 feature_defn = layer.GetLayerDefn() feature = ogr.Feature(feature_defn) feature.SetGeometry(polygon) feature.SetField('id', 1) # 将要素添加到图层 layer.CreateFeature(feature) # 清理资源 feature = None data_source = None ``` 请替换代码中的经纬度坐标(lon1, lat1),(lon2, lat2),(lon3, lat3)为您的实际坐标。运行代码后,将生成名为"output.shp"的Shapefile文件,包含一个名为"polygon"的图层,其中包含一个多边形要素。 请注意,此示例代码仅生成一个多边形要素,您可以根据需要添加更多的坐标点来创建更复杂的多边形。另外,确保已安装GDAL库,可以使用`pip install gdal`命令进行安装。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值