【python010】获取任意多边形区域内的经纬度点并可视化

news2024/11/25 20:19:29

1.熟悉、梳理、总结项目研发实战中的Python开发日常使用中的问题、知识点等,如获取任意多边形区域内的经纬度点并可视化,找了N篇文章没发现有效的解决方案。
2.欢迎点赞、关注、批评、指正,互三走起来,小手动起来!
3.欢迎点赞、关注、批评、指正,互三走起来,小手动起来!
4.欢迎点赞、关注、批评、指正,互三走起来,小手动起来!

文章目录

    • 1.获取任意多边形边界经纬度`json`数据
    • 2.根据多边形区域生成区域内的坐标点数据`Python`代码
    • 3.经纬度点集压缩`Python`代码
    • 4.生成点位可视化`html`代码
    • 5.多边形及区域内经纬度点集可视化效果

1.获取任意多边形边界经纬度json数据

  • 方法一:http://www.guihuayun.com/maps/region_datav.php
    在这里插入图片描述

  • 方法二(高德平台):https://lbs.amap.com/demo/javascript-api-v2/example/district-search/draw-district-boundaries
    在这里插入图片描述

  • json数据坐标点位解析python代码示例

    jsonp_480370_1717574386373_ = {
        "status": "1",
        "info": "OK",
        "infocode": "10000",
        "count": "1",
        "suggestion": {
            "keywords": [],
            "cities": []
        },
        "districts": [{
            "citycode": "0571",
            "adcode": "330112",
            "name": "临安区",
            "polyline": "119.826803,30.134153;119.826136,30.133364;119.824951,30.133047;119.821774,30.132589;119.817282,30.131128;119.814503,30.130486;119.813499,30.129761;119.811872,30.126984;119.81059,30.125801;119.807812,30.124766;119.804677,30.122295;119.80324,30.12009;119.802538,30.117812;119.802746,30.114885;119.802495,30.112591;119.802087,30.111689;119.800962,30.111131;119.797126,30.11034;119.791012,30.107358;119.790137,30.106339;119.789781,30.105194;119.789997,30.099349;119.789391,30.098497",
            "center": "119.724457,30.234375",
            "level": "district",
            "districts": []
        }]
    }
    
    import geohash
    import pandas as pd
    
    ll_result = []
    lnglats = []
    for ii in jsonp_480370_1717574386373_['districts'][0]['polyline'].split(';'):
        lng, lat = ii.split(',')
        lnglats.append( [float(lng), float(lat)] )
        ll_result.append( [lng, lat, geohash.encode( float(lat), float(lng), 6 )] )
        
    ll_result_df = pd.DataFrame( ll_result )
    ll_result_df.columns = ['lng', 'lat', 'geohash6']
    ll_result_df.head(3)
    
  • 边界数据可视化效果在这里插入图片描述

2.根据多边形区域生成区域内的坐标点数据Python代码

  • polygon_coords = lnglats
    # 导入必要的库
    # pip install shapely
    import numpy as np
    from shapely.geometry import Point, Polygon
    
    # ================================================
    # 经纬度坐标点 lnglats(list) 数组赋值
    polygon_coords = lnglats # 定义多边形区域的顶点坐标
    grid_interval = 0.005 # 定义格网的经纬度间隔
    
    # 定义格网范围
    min_lon = min(polygon_coords, key=lambda x: x[0])[0]
    max_lon = max(polygon_coords, key=lambda x: x[0])[0]
    min_lat = min(polygon_coords, key=lambda x: x[1])[1]
    max_lat = max(polygon_coords, key=lambda x: x[1])[1]
    
    # 划分格网
    lon_range = np.arange(min_lon, max_lon, grid_interval)
    lat_range = np.arange(min_lat, max_lat, grid_interval)
    
    
    polygon = Polygon(polygon_coords)
    grid_points = []
    for lon in lon_range:
        for lat in lat_range:
    #         print( lon, lat )
            point = Point(lon, lat)
    #         print( polygon.contains(point) )
            if polygon.contains(point): # 判断格网是否在多边形内
                grid_points.append((lon, lat))
    
    # 打印落入多边形内的经纬度坐标格网
    for point in grid_points:
        print(point)
    

3.经纬度点集压缩Python代码

  • 提示: 如果经纬度点太多,可视化过程比较慢,可能导致浏览器崩溃。

    import math
    EARTH_RADIUS = 6371000 # 地球平均半径,单位:米
    def haversine(lat1, lon1, lat2, lon2):
    	"""计算两个经纬度点之间的距离(单位:米)"""
    	lat1, lon1, lat2, lon2 = map(math.radians, [lat1, lon1, lat2, lon2]) # 将经纬度转换为弧度
    	dlon = lon2 - lon1 # Haversine公式
    	dlat = lat2 - lat1
    	a = math.sin(dlat/2)**2 + math.cos(lat1) * math.cos(lat2) * math.sin(dlon/2)**2
    	c = 2 * math.asin(math.sqrt(a))
    	r = EARTH_RADIUS
    	return c * r
    
    def merge_points(points, threshold=10):
        """合并距离在threshold(单位:米)以内的经纬度点"""
        merged_points = []
        for point in points:
            merged = False
            for merged_point in merged_points:
                distance = haversine(point[0], point[1], merged_point[0], merged_point[1])
                if distance <= threshold:
                    merged = True # 更新已合并的点(这里简单地取第一个点的经纬度)
                    break
        if not merged:
            merged_points.append(point)
        return merged_points
    
    points = lnglats
    merged_points = merge_points(points, threshold=500)
    print(len(merged_points), len(lnglats))
    

4.生成点位可视化html代码

  • ak=tUUW8mROQP659ly3fqG7eOjRz2kku5xt 替换为自己的百度ak
    <!DOCTYPE html>
    <html>
    <head>
    	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    	<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
    	<style type="text/css">
    		body, html,#allmap {width: 100%;height: 100%;overflow: hidden;margin:0;font-family:"微软雅黑";}
    		#l-map{height:100%;width:78%;float:left;border-right:2px solid #bcbcbc;}
    		#r-result{height:100%;width:20%;float:left;}
    	</style>
    	<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=tUUW8mROQP659ly3fqG7eOjRz2kku5xt"></script>
    	<title>任意多边形区域及内部经纬度点位可视化</title>
    </head>
    <body>
    	<div id="allmap"></div>
    </body>
    </html>
    <script type="text/javascript">
    // 经纬度数据对象
    var pointDataBJ = [ ]; // 多边形区域边界经纬度点位集合
    var pointData = [ ]; // 多边形内部经纬度点位集合
    var pointD = new BMap.Point(119.79569599999995, 30.133075); // 经纬度对象
    var map = new BMap.Map("allmap");  // 创建百度地图实例
    map.enableScrollWheelZoom(); // 允许百度地图缩放
    map.centerAndZoom(pointD, 1);  // 初始化地图级别和中心店
    function showPointBJ (pointArr) {
    	var myIconBJ = new BMap.Icon("./map_normal_bj.svg", new BMap.Size(50,50));
        pointArr.forEach(function(item, index){
            var point = new BMap.Point(item.longitude, item.latitude); // 经纬度对象
            var marker = new BMap.Marker(point, {icon: myIconBJ});  // 创建标注
            marker.mapDataIndex = index; // 将数据对象的索引存到对象中
            map.addOverlay(marker);  // 将标注添加到地图中
            marker.addEventListener("click",getAttr);
            
        });
    }
    function showPoint (pointArr) {
    	var myIcon = new BMap.Icon("./map_normal.svg", new BMap.Size(50,50));
        pointArr.forEach(function(item, index){
            var point = new BMap.Point(item.longitude, item.latitude); // 经纬度对象
            var marker = new BMap.Marker(point, {icon: myIcon});  // 创建标注
            marker.mapDataIndex = index; // 将数据对象的索引存到对象中
            map.addOverlay(marker);  // 将标注添加到地图中
            marker.addEventListener("click",getAttr);
            
        });
    }
    // 调用的点击事件
    function getAttr(){
        // maker对象调用this就会指向他
    	var obj = this.getPosition();       //获取marker的位置
        alert("marker的位置是" + obj.lng + "," + obj.lat);
        alert("marker的索引是" + this.mapDataIndex);
         // window.location.href="http://www.baidu.com";   
    }
    showPointBJ(pointDataBJ);
    showPoint(pointData);
    </script>
    

5.多边形及区域内经纬度点集可视化效果

  • 1000米间隔
    在这里插入图片描述
  • 2000米间隔
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1805875.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Here Doucument

一、Here Document概述 1.概念 使用I/0重定向的方式将命令列表提供给交互式程序 标准输入的一种替代品 2.语法格式 命令 <<标记 标记 3.注意事项 标记可以使用任意合法字符&#xff08;通常为EOF&#xff09; 结尾的标记一定要顶格写&#xff0c;前面不能有任何字符…

【爬虫实战项目一】Python爬取豆瓣电影榜单数据

目录 一、环境准备 二、编写代码 2.1 分页分析 2.2 编码 一、环境准备 安装requests和lxml pip install requests pip install lxml 二、编写代码 2.1 分页分析 编写代码前我们先看看榜单的url 我们假如要爬取五页的数据&#xff0c;那么五个url分别是&#xff1a; htt…

关于智慧校园建设的几点建议

随着科技的迅猛发展&#xff0c;智慧校园建设已成为现代教育的重要组成部分&#xff0c;对于提升教育质量、改善学生学习环境具有重要意义。为此&#xff0c;我提出以下几点建议&#xff0c;以帮助智慧校园建设更加有效和可持续。 首先&#xff0c;应注重基础设施建设。智慧校园…

java 实现导出word 自定义word 使用aspose教程包含图片 for 循环 自定义参数等功能

java 实现导出word 主要有一下几个知识点 1&#xff0c;aspose导入 jar包 和 java编写基础代码下载使用 aspose-words jar包导入 aspose jar 包 使用 maven导入java代码编写 2&#xff0c;if判断 是否显示2&#xff0c;显示指定值3&#xff0c;循环显示List 集合列表 使用 fore…

【CTF MISC】XCTF GFSJ0290 reverseMe Writeup(图像处理)

reverseMe 暂无 解法 导入 Photoshop。 水平翻转&#xff0c;得到 flag。 Flag flag{4f7548f93c7bef1dc6a0542cf04e796e}声明 本博客上发布的所有关于网络攻防技术的文章&#xff0c;仅用于教育和研究目的。所有涉及到的实验操作都在虚拟机或者专门设计的靶机上进行&#xf…

住宿管理系统 java+jsp+web三件套

文章目录 1、简要介绍2、数据库设计3、中间遇到的困难一、数据问题二、文件问题 4、项目 写了将近3周&#xff0c;人都写麻了 记录下&#xff0c;第一个 ss 代码 仅仅使用了layui作为前端UI框架&#xff0c;因为另一个项目用的也是他&#xff0c;感觉一些组件比较好用 后端是j…

Leetcode:三数之和

题目链接&#xff1a;15. 三数之和 - 力扣&#xff08;LeetCode&#xff09; 普通版本&#xff08;排序 双指针法&#xff09; 分析&#xff1a; 1、我们可以通过三个循环嵌套找到符合题目要求的三元组组合 2、但由于题目要求中的三元组i、j、k并不要求连续&#xff0c;所以会…

大模型的发展历程

1、早期模型的探索与局限性 1.1早期模型的探索与局限性 从早期的符号逻辑到现代的深度学习 1 模型&#xff0c;AI 领域经历了数十年的探索和迭代&#xff0c;为后续突破打下了坚实基础。随着大数据的发展和 AI 计算能力的爆炸式增长&#xff0c;深度学习模型的崛起显得尤为突出…

Spring运维之业务层测试数据回滚以及设置测试的随机用例

业务层测试数据回滚 我们之前在写dao层 测试的时候 如果执行到这边的代码 会在数据库 里面留下数据 运行一次留一次数据 开发有开发数据库&#xff0c;运行有运行数据库 我们先连数据库 在pom文件里引入mysql的驱动和mybatis-plus的依赖 在数据层写接口 用mybatis-plus进…

使用Python在Word中创建和提取表格

目录 安装Python Word库 使用Python在Word中创建预定义行和列的表格 使用Python在Word中动态创建表格 使用Python在Word中提取表格数据 Word 文档中的表格是一种强大且灵活的数据组织和展示工具&#xff0c;它能将信息以行和列的形式有序地排列&#xff0c;使文档内容更加清…

SQL Developer迁移第三方数据库单表到Oracle

在SQL Developer中&#xff0c;除可用Migration Wizard迁移第三方数据库到Oracle外&#xff0c;单表的迁移可以用Copy To Oracle ...菜单。右键单击源表即可。 本例的源表为MySQL数据库employees中的表&#xff1a;departments。 Options页面&#xff1a;指定目标库&#xff…

如何将 Windows图片查看器的背景颜色改成浅色(灰白色)?

现在大家基本都在使用Win10系统&#xff0c;我们在双击查看图片时&#xff0c;系统默认使用系统自带的图片&#xff08;照片&#xff09;查看器去打开图片。图片查看器的背景色默认是黑色的&#xff0c;如下所示&#xff1a;&#xff08;因为大家可能会遇到同样的问题&#xff…

pxe自动装机与无人值守

一、pxe与无人值守 pxe&#xff1a;c/s 模式&#xff0c;允许客户端通过网络从远程服务器&#xff08;服务端&#xff09;下载引导镜像&#xff0c;加载安装文件&#xff0c;实现自动化安装操作系统。 pxe的优点&#xff1a; 1、规模化 同时装配多台服务器&#xff08;20多&…

Hive知识体系保姆级教程

一. Hive概览 1.1 hive的简介 Hive是基于Hadoop的一个数据仓库工具&#xff0c;可以将结构化的数据文件映射为一张数据库表&#xff0c;并提供类SQL查询功能。 其本质是将SQL转换为MapReduce/Spark的任务进行运算&#xff0c;底层由HDFS来提供数据的存储&#xff0c;说白了h…

【wiki知识库】06.文档管理页面的添加--前端Vue部分

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 目录 一、&#x1f525;今日目标 二、&#x1f43b;前端Vue模块的改造 BUG修改 1.wangeditor无法展示问题 2.弹窗无法正常关闭问题 2.1 添加admin-doc.vue 2.1.1 点击admin-ebook中的路由跳转到admin-doc 2.2.2 进入…

【DrissionPage】Linux上如何将https改为http

最近有个老板找我做一个自动化的程序&#xff0c;要求部署到Linux上 这是一个http协议的网站&#xff0c;chrome在默认设置下&#xff0c;会将http的网站识别成不安全的内容&#xff0c;然后自动将http转化成https访问 但是&#xff0c;这个http的网站它的加载项里既有http的…

Java | Leetcode Java题解之第132题分割回文串II

题目&#xff1a; 题解&#xff1a; class Solution {public int minCut(String s) {int n s.length();boolean[][] g new boolean[n][n];for (int i 0; i < n; i) {Arrays.fill(g[i], true);}for (int i n - 1; i > 0; --i) {for (int j i 1; j < n; j) {g[i]…

Centos X系统yum安装mysql数据库

安装之前需要将系统自带的mariadb-libs软件包删除。 检查是否存在mariadb-libs包。 yum list installed|grep mariadb-libs 删除mariadb-libs包 yum -y remove mariadb-libs 声明&#xff1a; 系统&#xff1a;CentOS-7-x86_64-DVD-2009 安装为最小化安装&#xff0c;没…

[线程与网络] Java虚拟机常考面试题(线程与网络完结)

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏:&#x1f355; Collection与数据结构 (92平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 &#x1f9c0;线程与…

MySQL: 表的增删改查(基础)

文章目录 1. 注释2. 新增(Create)3. 查询(Retrieve)3.1 全列查询3.2 指定列查询3.3 查询字段为表达式3.4 别名3.5 去重: distinct3.6 排序: order by3.7条件查询3.8 分页查询 4. 修改 (update)5. 删除(delete)6. 内容重点总结 1. 注释 注释&#xff1a;在SQL中可以使用“–空格…