shapely 经纬度相关计算

目录

判断经纬度是否落在轮廓里

获得轮廓的中心点

轮廓的中心点,及各个坐标串到中心点的最小距离

经纬度扩充


判断经纬度是否落在轮廓里

经纬度 lng,lat

轮廓 polygon,即经纬度坐标串,取值格式如下:

POLYGON ((113.757503 23.016089, 113.75749818472667 23.01599098285967, 113.7574837852804 23.015893909677985, 113.75745994033572 23.015798715322745, 113.7574268795325 23.015706316567634, 113.75738492126435 23.015617603263173))

is_in 得到的是 bool 值

from shapely import wkt

is_in = wkt.loads(polygon).contains(wkt.loads("POINT (" + str(lng) + ' ' + str(lat) + ')'))

获得轮廓的中心点

polygon 取值格式如第一个标题样例,在计算是必须转换为 shapely 能计算的对象

from shapely import wkt
from shapely.geometry import Point,polygon

polygon = wkt.loads(polygon) # 转换能计算的 shapely 对象
center = str(poly.centroid.x) + " " + str(poly.centroid.y)

或者

center = polygon.centroid

轮廓的中心点,及各个坐标串到中心点的最小距离

def def_projectpoly(project_poly):
    '''
    计算每条数据轮廓的中心点,及各个坐标串到中心点的最小距离
    '''
    # poly = project_poly['polygon'].iloc[0]
    def def_poly_min_distance(poly):
        poly_center = str(poly.centroid.x) + " " + str(poly.centroid.y)
        poly_wkt = poly.wkt.replace("POLYGON ","").replace("(","").replace(")","").replace("MULTI","")
        poly_wkt_list = poly_wkt.split(", ")
        # 计算坐标串各个组到中心点最短距离
        min_distance = 1000000
        for ind in poly_wkt_list:
            distance = geodistance(float(poly_center.split(" ")[0]),float(poly_center.split(" ")[1]),float(ind.split(" ")[0]),float(ind.split(" ")[1]))
            if distance < min_distance:
                min_distance = distance
        return min_distance

    # 将轮廓坐标串转换为 shape 对象
    project_poly['polygon'] = project_poly['polygon'].map(lambda x: wkt.loads(x))
    project_poly['min_distance'] = project_poly['polygon'].apply(lambda x:def_poly_min_distance(x))
    project_poly['poly_center'] = project_poly['polygon'].apply(lambda x:str(x.centroid.x) + " " + str(x.centroid.y))
    return project_poly


def geodistance(lng1, lat1, lng2, lat2):
    '''
    计算两两坐标的距离,在此是计算经纬度到轮廓中心点的距离
    '''
    # lng1,lat1,lng2,lat2 = (120.12802999999997,30.28708,115.86572000000001,28.7427)
    lng1, lat1, lng2, lat2 = map(radians, [float(lng1), float(lat1), float(lng2), float(lat2)])  # 经纬度转换成弧度
    dlon = lng2 - lng1
    dlat = lat2 - lat1
    a = sin(dlat / 2) ** 2 + cos(lat1) * cos(lat2) * sin(dlon / 2) ** 2
    distance = 2 * asin(sqrt(a)) * 6371 * 1000  # 地球平均半径,6371km
    distance = round(distance / 1000, 3)
    return distance

经纬度扩充

扩充 50m,100m 写法如下

如果轮廓坐标串数量小于 10,则每个经纬度扩充 100m

from shapely import wkt
from shapely.geometry import Point,polygon

# 扩充范围在这里,0.0005 为 50m,0.001 为 100m
project['polygon'] = project['polygon'].apply(lambda x:x.buffer(0.0005) if len(str(x)) > 10 else '')## 增加在这里改

project['polygon'] = project.apply(lambda row:Point(row['LNG'],row['LAT']).buffer(0.001) if len(str(row['polygon'])) < 10 else row['polygon'],axis=1)

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要计算python经纬度对应的直线与圆的交点,需要使用数学库如numpy和Shapely。下面是一个简单的步骤: 1. 首先,导入所需的库,包括numpy和Shapely: ```python import numpy as np from shapely.geometry import Point, LineString ``` 2. 定义经纬度点的坐标和圆心的经纬度坐标: ```python lat1 = 40.7128 # 点1的纬度 lon1 = -74.0060 # 点1的经度 lat2 = 41.8781 # 点2的纬度 lon2 = -87.6298 # 点2的经度 circle_center_lat = 43.6532 # 圆心的纬度 circle_center_lon = -79.3832 # 圆心的经度 circle_radius = 100 # 圆的半径(单位:米) ``` 3. 根据经纬度点创建直线和圆对象: ```python point1 = Point(lon1, lat1) point2 = Point(lon2, lat2) line = LineString([point1, point2]) circle = Point(circle_center_lon, circle_center_lat).buffer(circle_radius / 111000) ``` 4. 计算直线与圆的交点: ```python intersection_points = line.intersection(circle) ``` 5. 获取交点的经纬度坐标: ```python intersection_coordinates = [] if intersection_points.geom_type == 'Point': intersection_coordinates.append((intersection_points.x, intersection_points.y)) elif intersection_points.geom_type == 'MultiPoint': for point in intersection_points: intersection_coordinates.append((point.x, point.y)) ``` 这样就可以通过给定的经纬度点、圆心和半径计算出直线与圆的交点的经纬度坐标了。请注意,以上代码只是一个示例,实际使用中需要根据具体情况进行调整。 ### 回答2: 在Python中,我们可以使用数学库或第三方库来计算直线与圆的交点。下面是一种使用sympy库进行计算的方法: 1. 首先,我们需要引入sympy库,并创建直线和圆的符号变量。 ``` import sympy as sp x, y = sp.symbols('x y') ``` 2. 接下来,我们需要定义直线和圆的方程。 ``` line_eq = sp.Eq(y, mx + c) # 直线方程,其中m为斜率,c为截距 circle_eq = sp.Eq((x - a)**2 + (y - b)**2, r**2) # 圆的方程,其中(a, b)为圆心坐标,r为半径 ``` 3. 然后,我们需要解这两个方程得到交点。 ``` intersection_points = sp.solve((line_eq, circle_eq), (x, y)) ``` 4. 最后,我们可以通过循环遍历得到的交点,并打印出它们的坐标。 ``` for point in intersection_points: x_val = sp.re(point[0]) # 提取实部,获取交点的x坐标 y_val = sp.re(point[1]) # 提取实部,获取交点的y坐标 print(f"交点的坐标为:({x_val}, {y_val})") ``` 请注意,以上代码只是给出了一种实现方式,具体的方程和计算方式可能根据问题的具体要求略有不同。 ### 回答3: 要通过经纬度计算直线与圆的交点,首先需要确定圆心的经纬度坐标和半径,以及直线上两个点的经纬度坐标。 1. 将经纬度坐标转换成大地坐标系中的三维直角坐标系(XYZ坐标系)。可以使用WGS84椭球模型将经纬度转化为XYZ坐标,公式如下: X = cos(lat) * cos(lon) Y = cos(lat) * sin(lon) Z = sin(lat) 其中,lat为纬度,lon为经度。 2. 计算直线的方程。假设直线上的两个点分别为A和B,它们的XYZ坐标分别为A(Xa, Ya, Za)和B(Xb, Yb, Zb)。根据两点式得到直线方程为: (x - Xa)/(Xb - Xa) = (y - Ya)/(Yb - Ya) = (z - Za)/(Zb - Za) 3. 计算直线与圆的交点。 a. 对于直线方程,将z用X和Y替换,得到: (x - Xa)/(Xb - Xa) = (y - Ya)/(Yb - Ya) = (sin(lat) - Za)/(Zb - Za) b. 将圆心的XYZ坐标代入,得到: (x - Xa)/(Xb - Xa) = (y - Ya)/(Yb - Ya) = (sin(latC) - Za)/(Zb - Za) 其中,latC为圆心的纬度。 c. 将直线和圆的方程联立,解方程组,得到交点坐标(x, y, z)。 4. 将交点的XYZ坐标转换回经纬度坐标。可以使用逆转换公式将XYZ坐标转化为经纬度。具体步骤是: a. 计算球面上的高度h和长度d,公式为: h = sqrt(x^2 + y^2 + z^2) - R d = sqrt(x^2 + y^2) b. 计算纬度和经度的值,公式为: lat = atan2(z / h, d / h) # 弧度换算成角度 lon = atan2(y, x) # 弧度换算成角度 通过以上步骤,可以计算出直线与圆的交点的经纬度坐标。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值