V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
godleon
V2EX  ›  程序员

根据经纬坐标判断是否在一个省份内 或者市内,这有开源的轮子吗?

  •  
  •   godleon · 7 天前 · 3306 次点击

    需求

    根据一个 经纬坐标点,判断是否在一个区域内, 区域可以自己绘制;

    比如我自己在地图上把河南省 + 北京市 绘制起来,然后我传入坐标 判断是否在区域内;

    我在网上搜到了一些实现方式都是很多年之前写的文章 都是基于空间算法和射线算法;

    技术栈上面 现在有比较新的技术来实现吗?

    求推荐学习;

    ps

    有没有哪里可以拿到 一个省份在地图上准确的区域,比如我要绘制一个河南省,边界点的坐标;

    32 条回复    2024-12-06 15:53:23 +08:00
    tool2dx
        1
    tool2dx  
       7 天前   ❤️ 1
    算法肯定有,就是 google map s2 开源算法。https://gojekfarm.github.io/s2-calc/

    但问题是,你要先下载全国 kml 图形格式才行。
    ElmerZhang
        2
    ElmerZhang  
       7 天前   ❤️ 2
    用 postgres 数据库的 postgis 扩展
    地图可以用 openstreetmap 的,只是要自己再加工处理一下
    另外可以查查国内测绘相关部门的网站上有没有地图数据可以下载
    ElmerZhang
        5
    ElmerZhang  
       7 天前
    哦对了,搞数据的时候留意一下数据是用的 WGS 坐标系还是 GCJ02 坐标系
    godleon
        6
    godleon  
    OP
       7 天前
    @tool2dx
    @ElmerZhang
    @malusama

    感谢大佬 研究一下
    luny
        7
    luny  
       7 天前
    这个我记得是有加密的吧,坐标和地图有偏移,毕竟地图是敏感数据
    liplushe
        8
    liplushe  
       7 天前
    省级行政区划数据,可以看看 Ant L7 的开源数据,不过由于政策影响,只有 GCJ02 坐标系的数据了 https://l7.antv.antgroup.com/custom/tools/map
    cat
        9
    cat  
       7 天前
    直接调用 天地图/百度/高德/腾讯 的地图接口,给坐标 返回地理位置,里面都带有城市信息
    David1119
        10
    David1119  
       7 天前
    使用阿里云接口: https://geo.datav.aliyun.com/areas_v3/bound/geojson?code=110000 ,获取省份边界点坐标,自己判断一下是否在区域内就行了
    https://datav.aliyun.com/portal/school/atlas/area_selector
    坐标系不同需要提前转换,python 的话可以用 shapely 这个库

    想用现成接口的话一般各家地图一般都有逆地理编码的 api:比如高德 https://lbs.amap.com/api/webservice/guide/api/georegeo
    caneman
        11
    caneman  
       7 天前
    做过类似的需求,当时的作法是先把省份地图的数据拿出来,shp 格式的好像是。然后提取边界的经纬度坐标,然后把问题转换为判断点是否在有界图形内,就知道某坐标在不在某个区域内了。
    ala2008
        12
    ala2008  
       7 天前
    1 、得有省市轮廓行政区边界数据 2 、使用 postgres 数据库的 postgis 函数或直接 java 相关 geotool 判断是否在范围内。另外一个方案就是在线地图获取判断了
    lslhz
        13
    lslhz  
       7 天前
    随便下载个空间拓扑相关的 js 库, 都有这个功能, 输入一个点 一个面, 判断他们是否相交就可以了
    xiangyuecn
        14
    xiangyuecn  
       7 天前   ❤️ 1
    高性能坐标查询 Java 工具 https://github.com/xiangyuecn/AreaCity-Query-Geometry

    本工具核心功能:使用 jts 库从省市区县乡镇边界数据( AreaCity-JsSpider-StatsGov 开源库)或 geojson 边界数据文件中查找出和任意点、线、面有相交的矢量边界,内存占用低,性能优良( 1 秒可查 1 万个以上坐标对应的城市信息)。

    省市区三级在线预览 https://xiangyuecn.github.io/AreaCity-JsSpider-StatsGov/assets/geo-echarts.html

    对口,打个硬广告😁
    yangzzzzzz
        15
    yangzzzzzz  
       7 天前
    高德
    santom
        16
    santom  
       7 天前
    谷歌地图有现成的 api 判断一个点是否在指定区域内,containsLocation 。感觉是不是能实现。别的地图应该也有现成的。
    省份区域网上应该有现成的 geoJson
    skallz
        17
    skallz  
       7 天前
    有一个开源库有做这个,判断传入坐标是否在某个地区经纬度坐标集内: https://github.com/pikaz-18/pikaz-location
    manhere
        18
    manhere  
       7 天前
    这不就是个电子围栏?
    wzcloud
        20
    wzcloud  
       7 天前 via iPhone
    公司有钱的话,直接调百毒或高德的 api……
    GotKiCry
        21
    GotKiCry  
       7 天前
    地图都是有现成的接口
    ggabc
        22
    ggabc  
       7 天前 via Android
    好几年前我是写了个爬虫
    Iamadog
        23
    Iamadog  
       7 天前
    最简单的办法就是用类似 echarts 等表格绘制中国地图时的 geojson 文件,里面有边界坐标,我记得 google 能搜到如何推算 geo 坐标是否包含经纬度
    Iamadog
        24
    Iamadog  
       7 天前
    frayesshi1
        25
    frayesshi1  
       7 天前
    qgis
    Biiddd
        26
    Biiddd  
       7 天前
    做过类似,uber 的算法,用经纬度比较哈希
    murmur
        27
    murmur  
       6 天前
    个人用直接经纬度换中文坐标是最简单的,你能到 10w 次访问么
    felbryiozzzz
        28
    felbryiozzzz  
       6 天前
    json 数据: https://geojson.hxkj.vip/

    判断是否在一个区域内:高德 SDK 的 Polygon contains https://lbs.amap.com/api/javascript-api-v2/documentation#polygoncontains
    alwaysol
        29
    alwaysol  
       6 天前
    我之前做个这个需求功能,是根据经纬度判断属于哪个省份,nodejs 的包 @turf/turf,你可以看看
    wupeaking
        30
    wupeaking  
       6 天前
    做个几年的 GIS 开发,这个需求蛮简单的,1. 直接调接口 (amap, bmap 都有类似的) 2. 有各个省份的 polygon 数据话直接存 pg ,调 pg 函数查询一句 SQL 语句就搞定。3. 有各个省份的 polygon 数据,不想用数据库,也能直接加载内存进行点面关系判断,C++的 boost geometry ,geos, gdal 库都支持,其他语言也有类似的库。不需要用到上述的 geohash 或者谷歌的 s2 ,uber 的 h3 等,这些是对位置进行了编码,不是适合用来做你这个需求,更适合用于大数据的快速索引查询。
    uni
        31
    uni  
       6 天前
    刚做过,python 用 Shapely 非常好用
    solar
        32
    solar  
       6 天前
    假设你已经有了区域的 geometry 数据,下面是一个示例接口:

    from flask import Flask, request, jsonify
    from shapely.geometry import Point, Polygon

    app = Flask(__name__)

    # 定义一个多边形区域,这里以一个简单的四边形为例
    polygon_coords = [(30.6167, 104.0667), (30.6167, 104.1667), (30.7167, 104.1667), (30.7167, 104.0667)]
    polygon = Polygon(polygon_coords)

    @app.route('/is_point_in_polygon', methods=['POST'])
    def is_point_in_polygon():
    data = request.json
    lat = data.get('lat')
    lon = data.get('lon')

    if lat is None or lon is None:
    return jsonify({'error': 'Please provide both latitude and longitude'}), 400

    point = Point(lon, lat) # 注意:shapely 的 Point 构造函数参数顺序是(x, y),即(lon, lat)

    is_inside = polygon.contains(point)

    return jsonify({'inside': is_inside})

    if __name__ == '__main__':
    app.run(debug=True)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1550 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 16:49 · PVG 00:49 · LAX 08:49 · JFK 11:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.