ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

点概括

2022-04-01 18:33:06  阅读:218  来源: 互联网

标签:概括 self mark np keep pnts gps


# coding:utf-8
import numpy as np
import geopandas as gpd
from shapely.geometry import Point, LineString
from scipy import spatial


class pointAbstract():

    def __init__(self, pnts, method="keep", near=150):
        # 空间点概括
        # 将near范围内的点聚合成 1 个
        # pnts:[[lng,lat], ……]

        self.pnts = pnts
        self.method = method
        self.near = near

    def step(self):
        pps = [Point(_) for _ in self.pnts]
        gps = gpd.GeoDataFrame({"geometry": pps}, crs=4326)
        gps_ = gps.to_crs(4527)
        gps_["cds"] = gps_.geometry.apply(lambda x: (np.array(x)[0], np.array(x)[1]))
        pps_ = gps_.cds.values.tolist()
        dm = spatial.distance.cdist(pps_, pps_, metric='euclidean')
        tu = np.triu(dm, k=1)
        td = np.tril(np.ones_like(dm), k=0)
        tx = tu - td
        idx, idy = np.where((tx > -1) & (tx < self.near))
        mark = [[x, y] for x, y in zip(idx, idy)]  # 需要处理的 点对

        _mark = set(list(range(len(self.pnts)))) - set(sum(mark, []))
        if self.method == "keep":
            keep = [np.random.choice(_) for _ in mark]
            print(keep)
            keep.extend(_mark)
            res = [self.pnts[_] for _ in set(keep)]

        elif self.method == "move":
            res = [self.pnts[_] for _ in _mark]
            nps = [[(self.pnts[i][0] + self.pnts[j][0]) / 2, (self.pnts[i][1] + self.pnts[j][1]) / 2] for i, j in mark]
            res = res + nps

        return res

    def ptsAbstract(self, maxiter=300):

        count = 0
        while 1:
            N = len(self.pnts)
            self.pnts = self.step()
            M = len(self.pnts)

            count = count+1 if count<maxiter else maxiter

            if M == N or count==maxiter:
                break
        return self.pnts


if __name__ == '__main__':
    pnts = [[113.5, 34.78], [113.5, 34.799], [113.5, 34.78], [113.5, 34.799], [113.5, 34.799], [113.5, 34.7991], [113.5, 34.795], [113.5, 34.790]]
    pa = pointAbstract(pnts)
    res = pa.ptsAbstract()

  

标签:概括,self,mark,np,keep,pnts,gps
来源: https://www.cnblogs.com/ddzhen/p/16088440.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有