web-dev-qa-db-ja.com

Shapelyのポリゴンからポイント/座標を抽出する

shapelyポリゴンを定義するポイントをどのように取得/抽出しますか?ありがとう!

シェイプポリゴンの例

from shapely.geometry import Polygon

# Create polygon from lists of points
x = [list of x vals]
y = [list of y vals]

polygon = Polygon(x,y)
47
ryanjdillon

そのため、Polygonクラスメソッドの組み合わせを使用してこれを達成することがトリックであることがわかりました。

測地線座標が必要な場合は、これらをWGS84に変換する必要があります(pyprojmatplotlibbasemapなどを使用)。

from shapely.geometry import Polygon

#Create polygon from lists of points
x = [list of x vals]
y = [list of y vals]

some_poly = Polygon(x,y)

# Extract the point values that define the perimeter of the polygon
x, y = some_poly.exterior.coords.xy
55
ryanjdillon

形の良いmapping関数を使用できます:

>>> from shapely.geometry import Polygon, mapping
>>> sh_polygon = Polygon(((0,0), (1,1), (0,1)))
>>> mapping(sh_polygon)
{'type': 'Polygon', 'coordinates': (((0.0, 0.0), (1.0, 1.0), (0.0, 1.0), (0.0, 0.0)),)}
16
Ikar Pohorský

ポリゴンには外部境界があり、場合によってはいくつかの内部境界があることを知るのに時間がかかりました。元の投稿では例として内部境界を持つポリゴンを使用していませんでしたが、回答の一部にはその区別が反映されていないため、ここに投稿しています。

外部境界を形成する点はCoordinateSequenceに配置され、次のように取得できます。

_polygon.exterior.coords
_

len(polygon.exterior.coords)を使用してこのオブジェクトの長さを見つけることができ、リストのようにオブジェクトにインデックスを付けることができます。たとえば、最初の頂点を取得するには、_polygon.exterior.coords[0]_を使用します。最初と最後のポイントは同じであることに注意してください。その繰り返し点のない頂点で構成されるリストが必要な場合は、_polygon.exterior.coords[:-1]_を使用します。

CoordinateSequence(繰り返される頂点を含む)をポイントのリストに変換できます:

_list(polygon.exterior.coords)
_

同様に、最初の内部境界を形成する頂点で構成されるCoordinateSequenceは_polygon.interiors[0].coords_として取得され、それらの頂点のリスト(繰り返しポイントなし)は_polygon.interiors[0].coords[:-1]_として取得されます。

14
pnklein

私はこれを使用しました:

_list(Zip(*p.exterior.coords.xy))
_

p = Polygon([(0,0),(1,1),(1,0),(0,0)])で作成されたポリゴンは以下を返します:

_[(0.0, 0.0), (1.0, 1.0), (1.0, 0.0), (0.0, 0.0)]
_
5
Anton vBR

座標のタプルだけでなく、ポリゴンを構成する形の良いポイントオブジェクトが本当に必要な場合は、次のようにできます。

points = MultiPoint(polygon.boundary.coords)
2
Rick Teachey

更新(2017-06-09):

最後の回答はshapelyの最新バージョンではもう機能しないようですので、このアップデートを提案します。

shapelyはNumpy配列インターフェイスを提供します(ドキュメントにあるとおり: http://toblerity.org/shapely/project.html

したがって、polyを形の良いポリゴンジオメトリにします。

In [2]: type(poly)
Out[2]: shapely.geometry.polygon.Polygon

このコマンドは、numpy配列への変換を行います。

In [3]: coordinates_array = np.asarray(poly.exterior.coords)

ヒント:
直接のジオメトリを指定しても機能しないように見えるため、ポリゴンのexterior.coordsを指定する必要があります。

In [4]: coordinates_array = np.asarray(poly)
Out[4]: array(<shapely.geometry.polygon.Polygon object at 0x7f627559c510>, dtype=object)    
1
s.k

NumPy.arrayを使用して、形の良いポリゴンをNumPy配列に変換できます。 NumPy配列の使用は、座標が2つの1次元配列ではなくペアになっているため、coords.xyによって返される配列よりも便利です。アプリケーションにとってより有用な方を使用してください。

import numpy as np
x = [1, 2, 3, 4]
y = [9, 8, 7, 6]
polygon = Polygon(x,y)
points = np.array(polygon)

# points is:
[[ 1 9]
 [ 2 8]
 [ 3 7]
 [ 4 6]]
1
mkosmala

次の2つの方法のいずれかを使用できます。

1)

p = Polygon([(1,0),(1,1),(0,1),(0,0)])
for x,y in p.exterior.coords:
   print(x,y)

上記のコードは次を出力します。 exterior.coordsはポリゴンを完成させる順序付けられたシーケンスを返すため、(1,0)は2回印刷されることに注意してください。

1.0 0.0
1.0 1.0
0.0 1.0
0.0 0.0
1.0 0.0

2)

p.exterior.coords.xy

以下を出力します

(array('d', [1.0, 1.0, 0.0, 0.0, 1.0]), array('d', [0.0, 1.0, 1.0, 0.0, 0.0]))
1
Jayanth