标签: shapely

两段之间的角度小于180(线)

我需要找到两个段(线)之间的"内部"角度,小于180度.有什么快速的方法在python2.7中做到这一点?(Shapely似乎没有这个功能)

segment1是x1,y1,x2,y2

segment2是x3,y3,x4,y4

在此输入图像描述

python geometry computational-geometry python-2.7 shapely

2
推荐指数
1
解决办法
1913
查看次数

寻找一种快速查找多边形点的方法属于使用Shapely

我有一组~36,000个多边形,代表该国的一个分区(〜县).我的python脚本收到很多点:pointId,经度,纬度.

对于每个点,我想发回pointId,polygonId.对于每个点,循环到所有多边形并使用myPoint.within(myPolygon)是非常低效的.

我认为匀称库提供了一种更好的方法来准备多边形,以便找到一个点的多边形成为树路径(国家,地区,子区域......)

到目前为止,这是我的代码:

import sys
import os
import json
import time
import string
import uuid

py_id = str(uuid.uuid4())

sys.stderr.write(py_id + '\n')
sys.stderr.write('point_in_polygon.py V131130a.\n')
sys.stderr.flush()

from shapely.geometry import Point
from shapely.geometry import Polygon
import sys
import json
import string
import uuid
import time

jsonpath='.\cantons.json'
jsonfile = json.loads(open(jsonpath).read())

def find(id, obj):
    results = []

    def _find_values(id, obj):
        try:
            for key, value in obj.iteritems():
                if key == id:
                    results.append(value)
                elif not isinstance(value, basestring):
                    _find_values(id, value)
        except AttributeError:
            pass

        try:
            for item in …
Run Code Online (Sandbox Code Playgroud)

python optimization performance graph shapely

2
推荐指数
1
解决办法
3027
查看次数

创建 Shapely 多边形的数据框会给出“ValueError:A LinearRing 必须至少有 3 个坐标元组”

我想创建一个热图,比如中国的省级人口,我在这里找到了类似问题的指南

尽管我不得不承认我并没有完全理解它们,但我在阅读示例代码时没有问题。然而,当我试图通过使用中国的 shapefile 来模仿这个例子时,代码运行正常,直到以下

df_map = pd.DataFrame({
    'poly': [Polygon(xy) for xy in m.china],
    'ward_name': [ward['NAME'] for ward in m.china_info]})
Run Code Online (Sandbox Code Playgroud)

它产生一个错误,说

df_map = pd.DataFrame({
    'poly': [Polygon(xy) for xy in m.china],
    'ward_name': [ward['NAME'] for ward in m.china_info]})
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释是什么导致了这个错误?

python polygon shapely valueerror

2
推荐指数
1
解决办法
6073
查看次数

使用Python计算多边形图形文件中的点数

我有一个由各个州组成的美国多边形图形文件,作为其属性值。此外,我还有一些数组,用于存储我也感兴趣的点事件的纬度和经度值。从本质上讲,我想“空间连接”点和面(或执行检查以查看每个面和面[即状态])点),然后求和每个州的点数,找出哪个州的“事件”数最多。

我相信伪代码将是这样的:

Read in US.shp
Read in lat/lon points of events
Loop through each state in the shapefile and find number of points in each state
print 'Here is a list of the number of points in each state: '
Run Code Online (Sandbox Code Playgroud)

任何库或语法将不胜感激。

根据我的判断,OGR库是我所需要的,但是我在语法上遇到了麻烦:

dsPolygons = ogr.Open('US.shp')  

polygonsLayer = dsPolygons.GetLayer()  


#Iterating all the polygons  
polygonFeature = polygonsLayer.GetNextFeature()  
k=0  
while polygonFeature:
    k = k + 1  
    print  "processing " + polygonFeature.GetField("STATE") + "-" + str(k) + " of " + str(polygonsLayer.GetFeatureCount())  

    geometry = …
Run Code Online (Sandbox Code Playgroud)

python geolocation shapefile qgis shapely

2
推荐指数
1
解决办法
3678
查看次数

使用匀称的坐标元组列表创建点

我有一个看起来像这样的坐标列表

myCoordinates
> [(2, -6), (21, 19)]
Run Code Online (Sandbox Code Playgroud)

我想将它们转换为shapely geometry对象,以便我可以对它们进行一些计算:

from shapely.geometry import Point
for i in myCoordinates:
    c = [Point(i[0], i[1])]

print c
> [<shapely.geometry.point.Point object at 0x1044033d0>]
Run Code Online (Sandbox Code Playgroud)

然而,这只给了我一个(!)几何对象。

但我做的时候这个

circles = [Point(random.random(), random.random()).buffer(random.random() * 0.1) for i in range(3)]
Run Code Online (Sandbox Code Playgroud)

我得到三个几何对象。

print circles
> [<shapely.geometry.polygon.Polygon object at 0x1043f6890>, <shapely.geometry.polygon.Polygon object at 0x10442f8d0>, <shapely.geometry.polygon.Polygon object at 0x10442f910>]
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?为什么它只将一个 Point 转换为几何对象,而不是我列表中的两个?

python geospatial geo shapely

2
推荐指数
1
解决办法
5834
查看次数

numpy meshgrid到Shapely多边形

我正在尝试创建一个numpy meshgrid并将其转换为Shapely多边形。我可能可以使用蛮力方法解决此问题,但是感觉必须要有一个很好的技巧才能完成,但是我还没有提出。

这使我获得了点网格(假设在Jupyter中运行)-

import numpy as np
from matplotlib import pyplot

fig = pyplot.figure(figsize=(10, 10))
ax = fig.add_subplot(111, aspect='equal')

x,y = np.mgrid[-5:-1:8j, 1:5:8j]
ax.plot(x,y, 'o', color='#000000')
pyplot.show()
Run Code Online (Sandbox Code Playgroud)

现在需要将所有这些点水平和垂直连接起来以形成Shapely多边形。我的第一个尝试是生成Shapely MultiLineString来绘制垂直和水平线,然后对其执行多边形化操作。这导致仅创建了主要的外部多边形-这是由于MultiLineString仅在外部多边形上包含了顶点。

我知道使用栅格和GDAL可能更合理,但我的情况要求最终结果为Shapely多边形。

跟踪解决方案的任何帮助将不胜感激!

python numpy shapely

2
推荐指数
1
解决办法
1077
查看次数

python:布尔数组到多边形

我有一个布尔数组,其中包含一个连接的True值组件,我想将其边界转换为多边形,例如在 shapely 中。

假设我的数组是img,我可以得到这样的边界索引

import numpy as np
from skimage.morphology binary_erosion

border_indices = np.transpose(np.nonzero(np.logical_xor(binary_erosion(img), img)))
Run Code Online (Sandbox Code Playgroud)

但是仅仅将它们输入到一个shapely.Polygon对象中是行不通的,因为这些点不是沿着边界排序的,而是按照递增xy值排序的。

可能可以使用 alpha 形状来解决这个问题(请注意,我不是在寻找凸包),但也许有人可以建议一种更简单的方法来获得边界多边形,最好是直接对原始数组进行操作。

python shapely

2
推荐指数
1
解决办法
1543
查看次数

如何使用 Python 镜像多边形?

我有一组绘制多边形的图像。我有这些多边形的点,我使用 Shapely 绘制这些点,并检查眼动仪的某些点是否落入多边形中。

现在,其中一些图像是镜像的,但我没有在其中绘制多边形的坐标。如何水平翻转多边形?有没有办法用 Shapely 做到这一点?

python shapely

2
推荐指数
2
解决办法
3230
查看次数

使用 shapely 指向多边形?

我正在运行以下脚本,我认为该脚本应该为多边形中的点返回 TRUE,但它返回 FALSE。

from shapely import geometry

polygon = [(-1571236.8349707182, 8989180.222117377), (1599362.9654156454, 8924317.946336618), (-1653179.0745812152, 8922145.163675062), (-1626237.6614402141, 8986445.107619021)]

Point_X = -1627875.474
Point_Y = 8955472.968

line = geometry.LineString(polygon)
point = geometry.Point(Point_X, Point_Y)

print(line.contains(point))
Run Code Online (Sandbox Code Playgroud)

当我在 Matlab 中绘制多边形并指向时,我得到以下形状

在此处输入图片说明

from matplotlib import pylab as plt
poly = [[-1571236.8349707182, 8989180.222117377],
    [1599362.9654156454, 8924317.946336618],
    [-1653179.0745812152, 8922145.163675062],
    [-1626237.6614402141, 8986445.107619021]]

x = [point[0] for point in poly]
y = [point[1] for point in poly]

p1 = [-1627875.474, 8955472.968]
p2 = [-1627875.474, 8955472.968]
plt.plot(x,y,p1[0],p1[1],'*r',p2[0],p2[1],'*b')
plt.show()
Run Code Online (Sandbox Code Playgroud)

知道为什么匀称的脚本返回 FALSE 吗?

python matlab matplotlib shapely

2
推荐指数
1
解决办法
5940
查看次数

评估类返回false

我写过这堂课:

class DSMCalc(object):
    def __init__(self, footprint):
        if footprint.__class__.__base__.__module__ is not 'shapely.geometry.base':
            raise TypeError('footprint input geometry is not a shapely geometry based object')
        self.footprint = footprint
Run Code Online (Sandbox Code Playgroud)

作为最好的,我可以告诉我需要做的全业务__class__.__base__.__module__,因为我想是包括所有匀称的对象(shapely.geometry.polygon.Polygonshapely.geometry.multipolygon.MultiPolygon,例如)和属性组合是我发现,好像这是可行的,因为所有的对象我想包括输出shapely.geometry.base.

但是,当我运行代码时,即使放入有效shapely.geometry.polygon.Polygon对象,我也会收到TypeError .我已经尝试了上面的代码shapely.geometry.base作为字符串和模块.怎么会这样?

一些示例对象重现错误:

valid_geojson_polygon_feature = {
'properties': {"name":"test"},
'type': 'Feature',
'geometry': {
    'coordinates': [[(-122.4103173469268, 37.78337247419125), (-122.41042064203376, 37.7833590750075),
                     (-122.41046641056752, 37.78360478527359), (-122.41047393562782, 37.783644775039576),
                     (-122.4103759761863, 37.78365638609612), (-122.4103173469268, 37.78337247419125)]],
    'type': 'Polygon'}}

from shapely.geometry import shape as get_shape
valid_shapely_polygon_feature = get_shape(valid_geojson_polygon_feature['geometry'])
print(valid_shapely_polygon_feature.__class__.__base__.__module__)
DSMCalc(valid_shapely_polygon_feature)
Run Code Online (Sandbox Code Playgroud)

python class shapely

2
推荐指数
1
解决办法
53
查看次数