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

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

  •  
  •   godleon · 16 天前 · 3427 次点击

    需求

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

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

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

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

    求推荐学习;

    ps

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

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

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

    感谢大佬 研究一下
    luny
        7
    luny  
       16 天前
    这个我记得是有加密的吧,坐标和地图有偏移,毕竟地图是敏感数据
    liplushe
        8
    liplushe  
       16 天前
    省级行政区划数据,可以看看 Ant L7 的开源数据,不过由于政策影响,只有 GCJ02 坐标系的数据了 https://l7.antv.antgroup.com/custom/tools/map
    cat
        9
    cat  
       16 天前
    直接调用 天地图/百度/高德/腾讯 的地图接口,给坐标 返回地理位置,里面都带有城市信息
    David1119
        10
    David1119  
       16 天前
    使用阿里云接口: 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  
       16 天前
    做过类似的需求,当时的作法是先把省份地图的数据拿出来,shp 格式的好像是。然后提取边界的经纬度坐标,然后把问题转换为判断点是否在有界图形内,就知道某坐标在不在某个区域内了。
    ala2008
        12
    ala2008  
       16 天前
    1 、得有省市轮廓行政区边界数据 2 、使用 postgres 数据库的 postgis 函数或直接 java 相关 geotool 判断是否在范围内。另外一个方案就是在线地图获取判断了
    lslhz
        13
    lslhz  
       16 天前
    随便下载个空间拓扑相关的 js 库, 都有这个功能, 输入一个点 一个面, 判断他们是否相交就可以了
    xiangyuecn
        14
    xiangyuecn  
       16 天前   ❤️ 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  
       16 天前
    高德
    santom
        16
    santom  
       16 天前
    谷歌地图有现成的 api 判断一个点是否在指定区域内,containsLocation 。感觉是不是能实现。别的地图应该也有现成的。
    省份区域网上应该有现成的 geoJson
    skallz
        17
    skallz  
       16 天前
    有一个开源库有做这个,判断传入坐标是否在某个地区经纬度坐标集内: https://github.com/pikaz-18/pikaz-location
    manhere
        18
    manhere  
       16 天前
    这不就是个电子围栏?
    wzcloud
        20
    wzcloud  
       16 天前 via iPhone
    公司有钱的话,直接调百毒或高德的 api……
    GotKiCry
        21
    GotKiCry  
       16 天前
    地图都是有现成的接口
    ggabc
        22
    ggabc  
       16 天前 via Android
    好几年前我是写了个爬虫
    Iamadog
        23
    Iamadog  
       16 天前
    最简单的办法就是用类似 echarts 等表格绘制中国地图时的 geojson 文件,里面有边界坐标,我记得 google 能搜到如何推算 geo 坐标是否包含经纬度
    Iamadog
        24
    Iamadog  
       16 天前
    frayesshi1
        25
    frayesshi1  
       16 天前
    qgis
    Biiddd
        26
    Biiddd  
       16 天前
    做过类似,uber 的算法,用经纬度比较哈希
    murmur
        27
    murmur  
       15 天前
    个人用直接经纬度换中文坐标是最简单的,你能到 10w 次访问么
    felbryiozzzz
        28
    felbryiozzzz  
       15 天前
    json 数据: https://geojson.hxkj.vip/

    判断是否在一个区域内:高德 SDK 的 Polygon contains https://lbs.amap.com/api/javascript-api-v2/documentation#polygoncontains
    alwaysol
        29
    alwaysol  
       15 天前
    我之前做个这个需求功能,是根据经纬度判断属于哪个省份,nodejs 的包 @turf/turf,你可以看看
    wupeaking
        30
    wupeaking  
       15 天前
    做个几年的 GIS 开发,这个需求蛮简单的,1. 直接调接口 (amap, bmap 都有类似的) 2. 有各个省份的 polygon 数据话直接存 pg ,调 pg 函数查询一句 SQL 语句就搞定。3. 有各个省份的 polygon 数据,不想用数据库,也能直接加载内存进行点面关系判断,C++的 boost geometry ,geos, gdal 库都支持,其他语言也有类似的库。不需要用到上述的 geohash 或者谷歌的 s2 ,uber 的 h3 等,这些是对位置进行了编码,不是适合用来做你这个需求,更适合用于大数据的快速索引查询。
    uni
        31
    uni  
       15 天前
    刚做过,python 用 Shapely 非常好用
    solar
        32
    solar  
       15 天前
    假设你已经有了区域的 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   ·   实用小工具   ·   1540 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 16:55 · PVG 00:55 · LAX 08:55 · JFK 11:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.