提出问题
最近开始了实习,前两天导师提出了一个问题,让我试着用自己的思路去解决它。
问题是这样的:由于采集到的基站的经纬度坐标信息不准确,导致生成的可视化坐标图里,基站标到海里去了。
试想这样的bug让用户看到也太丑了8。
解决思路
所以解决思路就是:没有思路。我的意思是,哪里出错点哪里。
由于对具体的业务实现不是十分的了解,我不知道通过什么标准来判断这个坐标是否错误。我只好根据所知问题中的“坐标在海里”为出发点去思考解决办法。那就是先判断这个点是不是在海里。
我觉得至少需要两个参数:
1. 待核查的点的坐标;
2. 标准范围坐标集。
至于实现方法嘛。很真实,百度谷歌先走起来。
经过搜索引擎的充电,我了解到了一个实现方法:PNPOLY算法。这个算法可以判断一个坐标点是否在一个多边形范围内,因为地图上的区域就是一个不规则多边形,所以这个算法正好适合我解题。
PNPOLY算法
该算法各个博客论坛已经有很多大牛讲解和实现了,比如:https://www.jianshu.com/p/3187832cb6cc
https://blog.csdn.net/qq_36706625/article/details/89160721
算法的核心思想大概是这么个意思:
过一点做射线,若该射线和多边形的交点为偶数,则证明该点不在图形内部。
也就是说如果它在图形内部,射线只出不进,交点数必然是奇数个;若在外部,有进有出或者不相交,交点个数必然是偶数。
表达能力有限,请谅解。
边界坐标集获取
网上找很多省行政区域坐标集,但是都不怎么实用,误差过大。自己试着通过解析地图网页的HTTPresponse来获得,发现更不实用。原因是涉及到了海岸线的省份的行政区域包括了海上的一部分。
无奈之下我只好先手动获取一个边界坐标集,通过百度地图API+JavaScript+右手实现。
这样的脚本网上可以找到很多,由于忘记我的是从哪里copy来的,无法给出原文链接,所以这里就不贴了。
获取到的坐标集是一个txt文本,每一行就是一个顶点的坐标,每个坐标的经纬度以英文逗号进行分隔。
python实现
为什么用python?
。。。因为现在电脑里只有python和Java的环境,而Java打包成.exe文件太麻烦,上次打包失败了,而python的就很简单。
事先说明:核心算法也不是我写的,它来自:
https://www.cnblogs.com/devli/p/10448780.html
我只是解读了一下然后修改了点,拿来主义万岁。
class Point:
lng = ''
lat = ''
def __init__(self, lng, lat):
self.lng = lng
self.lat = lat
# 求外包矩形
def get_polygon_bounds(points):
length = len(points)
top = down = left = right = points