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

我有一组~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) 我想创建一个热图,比如中国的省级人口,我在这里找到了类似问题的指南。
尽管我不得不承认我并没有完全理解它们,但我在阅读示例代码时没有问题。然而,当我试图通过使用中国的 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)
有人可以向我解释是什么导致了这个错误?
我有一个由各个州组成的美国多边形图形文件,作为其属性值。此外,我还有一些数组,用于存储我也感兴趣的点事件的纬度和经度值。从本质上讲,我想“空间连接”点和面(或执行检查以查看每个面和面[即状态])点),然后求和每个州的点数,找出哪个州的“事件”数最多。
我相信伪代码将是这样的:
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) 我有一个看起来像这样的坐标列表
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 转换为几何对象,而不是我列表中的两个?
我正在尝试创建一个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多边形。
跟踪解决方案的任何帮助将不胜感激!
我有一个布尔数组,其中包含一个连接的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对象中是行不通的,因为这些点不是沿着边界排序的,而是按照递增x和y值排序的。
可能可以使用 alpha 形状来解决这个问题(请注意,我不是在寻找凸包),但也许有人可以建议一种更简单的方法来获得边界多边形,最好是直接对原始数组进行操作。
我有一组绘制多边形的图像。我有这些多边形的点,我使用 Shapely 绘制这些点,并检查眼动仪的某些点是否落入多边形中。
现在,其中一些图像是镜像的,但我没有在其中绘制多边形的坐标。如何水平翻转多边形?有没有办法用 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 吗?
我写过这堂课:
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.Polygon和shapely.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 ×10
shapely ×10
class ×1
geo ×1
geolocation ×1
geometry ×1
geospatial ×1
graph ×1
matlab ×1
matplotlib ×1
numpy ×1
optimization ×1
performance ×1
polygon ×1
python-2.7 ×1
qgis ×1
shapefile ×1
valueerror ×1