Lingkungan: Win10 64 bit
Versi: kapan:
>>> shapely.__version__
'1.6a1'
Membuat objek yang indah dari wkt berfungsi untuk titik dan string garis
dari shapely.geometry import asShape
>>> asShape({'type': 'Point', 'coordinates': (0.0, 0.0)}).buffer(1.0).area
3.1365484905459384
>>> asShape({'type': "LineString", "coordinates": [(-1,0),(0,0)]}).buffer(1.0).area
5.13654849054594
tetapi dalam kasus poligon gagal. Objek tampaknya dibuat,
>>> asShape({'type': "Polygon", "coordinates": [(0,0), (0,1), (1,1),(1,0),(0,0)]})
<shapely.geometry.polygon.PolygonAdapter object at 0x00000251C2CA7710>
namun memanggil metode apa pun yang melempar pengecualian
>>> asShape({'type': "Polygon", "coordinates": [(0,0), (0,1), (1,1),(1,0),(0,0)]}).area
Traceback (most recent call last):
File "C:\Anaconda3\lib\site-packages\shapely\geometry\polygon.py", line 407, in geos_linearring_from_py
array = ob.__array_interface__
AttributeError: 'tuple' object has no attribute '__array_interface__'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<pyshell#66>", line 1, in <module>
asShape({'type': "Polygon", "coordinates": [(0,0), (0,1), (1,1),(1,0),(0,0)]}).area()
File "C:\Anaconda3\lib\site-packages\shapely\geometry\base.py", line 431, in area
return self.impl['area'](self)
File "C:\Anaconda3\lib\site-packages\shapely\topology.py", line 55, in __call__
self._validate(this)
File "C:\Anaconda3\lib\site-packages\shapely\topology.py", line 17, in _validate
if ob is None or ob._geom is None:
File "C:\Anaconda3\lib\site-packages\shapely\geometry\proxy.py", line 49, in _geom
self.__geom__, n = self.factory(self.context[0], self.context[1])
File "C:\Anaconda3\lib\site-packages\shapely\geometry\polygon.py", line 526, in geos_polygon_from_py
ret = geos_linearring_from_py(shell)
File "C:\Anaconda3\lib\site-packages\shapely\geometry\polygon.py", line 468, in geos_linearring_from_py
n = len(ob[0])
TypeError: object of type 'int' has no len()
Contoh-contoh ini tidak menggunakan WKT. http://toblerity.org/shapely/manual.html#well -known-formats
Mereka menggunakan representasi __geo_interface__ dari geometri, yang baik-baik saja.
Alasan poligon Anda gagal adalah karena tidak valid. Urutan koordinat poligon harus berupa daftar daftar koordinat, bukan daftar koordinat seperti yang Anda miliki. Ini karena poligon terdiri dari beberapa cincin linier - cincin eksterior, dan beberapa cincin interior opsional.
Kode berikut berfungsi. Perhatikan tanda kurung tambahan di koordinat.
>>> polygon = asShape({'type': "Polygon", "coordinates": [[(0,0), (0,1), (1,1),(1,0),(0,0)]]})
>>> polygon.is_valid
Perhatikan juga bahwa jika Anda tidak menggunakan array numpy untuk koordinat, Anda juga bisa menggunakan shape()
alih-alih asShape()
. Dalam hal ini kesalahan segera muncul, bukan ketika Anda mencoba mengakses data. http://toblerity.org/shapely/shapely.geometry.html#shapely.geometry.asShape
Oke, saya salah mengeja daftarnya, tetapi formulir yang benar tidak berfungsi:
polygon = asShape({'type': "Polygon", "coordinates": [(0,0), (0,1), (1,1),(1,0),(0,0)]})
>>> polygon.area
Traceback (most recent call last):
File "C:\Anaconda3\lib\site-packages\shapely\geometry\polygon.py", line 407, in geos_linearring_from_py
array = ob.__array_interface__
AttributeError: 'tuple' object has no attribute '__array_interface__'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<pyshell#8>", line 1, in <module>
polygon.area
File "C:\Anaconda3\lib\site-packages\shapely\geometry\base.py", line 431, in area
return self.impl['area'](self)
File "C:\Anaconda3\lib\site-packages\shapely\topology.py", line 55, in __call__
self._validate(this)
File "C:\Anaconda3\lib\site-packages\shapely\topology.py", line 17, in _validate
if ob is None or ob._geom is None:
File "C:\Anaconda3\lib\site-packages\shapely\geometry\proxy.py", line 49, in _geom
self.__geom__, n = self.factory(self.context[0], self.context[1])
File "C:\Anaconda3\lib\site-packages\shapely\geometry\polygon.py", line 526, in geos_polygon_from_py
ret = geos_linearring_from_py(shell)
File "C:\Anaconda3\lib\site-packages\shapely\geometry\polygon.py", line 468, in geos_linearring_from_py
n = len(ob[0])
TypeError: object of type 'int' has no len()
bahkan jika saya menggunakan array numpy:
arr = numpy.array([(0,0), (0,1), (1,1),(1,0),(0,0)])
ss = asShape({'type': "Polygon", "coordinates": arr})
>>> ss.area
Traceback (most recent call last):
File "<pyshell#16>", line 1, in <module>
ss.area
File "C:\Anaconda3\lib\site-packages\shapely\geometry\base.py", line 431, in area
return self.impl['area'](self)
File "C:\Anaconda3\lib\site-packages\shapely\topology.py", line 55, in __call__
self._validate(this)
File "C:\Anaconda3\lib\site-packages\shapely\topology.py", line 17, in _validate
if ob is None or ob._geom is None:
File "C:\Anaconda3\lib\site-packages\shapely\geometry\proxy.py", line 49, in _geom
self.__geom__, n = self.factory(self.context[0], self.context[1])
File "C:\Anaconda3\lib\site-packages\shapely\geometry\polygon.py", line 526, in geos_polygon_from_py
ret = geos_linearring_from_py(shell)
File "C:\Anaconda3\lib\site-packages\shapely\geometry\polygon.py", line 408, in geos_linearring_from_py
assert len(array['shape']) == 2
AssertionError
@pythonfun0 Definisi poligon Anda kurang tepat. Coba ini:
polygon = shape({'type': "Polygon", "coordinates": [[(0,0), (0,1), (1,1),(1,0),(0,0)]]})
Perhatikan kumpulan tanda kurung tambahan di sekitar koordinat. Struktur untuk GeoJSON Polygon
adalah:
Untuk tipe "Polygon", anggota "koordinat" harus berupa larik dari larik koordinat LinearRing. Untuk Poligon dengan banyak cincin, yang pertama harus cincin luar dan yang lainnya harus cincin atau lubang bagian dalam.
Dengan kata lain:
{
"type": "Polygon",
"coordinates": [
[<outer ring: (x, y), (x, y), ...>],
[<hole 1 ring: (x, y), (x, y), ...>],
[<hole 2 ring: (x, y), (x, y), ...>],
]
}
tetapi Anda tidak memiliki lubang, jadi Anda perlu:
{
"type": "Polygon",
"coordinates": [
[<outer ring: (x, y), (x, y), ...>],
]
}
Contoh LineString
Anda berfungsi karena cincin luar saja _is_ a valid LineString
, tetapi itu bukan Polygon
yang valid dengan sendirinya kecuali jika disarangkan dengan benar.
Jika Anda membaca dengan seksama komentar saya nanti, saya menulis bahwa itu bukan daftar bersarang, saya salah mengejanya!
Jadi, sekali lagi saya mencoba membuat poligon dari wkt dengan cara ini:
polygon = asShape({'type': "Polygon", "coordinates": [(0,0), (0,1), (1,1),(1,0),(0,0)]})
Saya tidak ingin membuat objek poligon bersarang!
Tolong, rekatkan contoh kode kerja nyata, jika Anda bisa memilikinya!
Terima kasih!
Jika Anda membaca dengan seksama komentar saya nanti, saya menulis bahwa itu bukan daftar bersarang, saya salah mengejanya!
Jadi, sekali lagi saya mencoba membuat poligon dari wkt dengan cara ini:
polygon = asShape({'type': "Polygon", "coordinates": [(0,0), (0,1), (1,1),(1,0),(0,0)]})
itu tidak bekerja dengan tanda kurung siku
polygon = asShape({'type':'Polygon', 'coordinates':[[0,0],[0,1],[1,1],[1,0]]})
Saya tidak ingin membuat objek poligon bersarang!
Tolong, rekatkan contoh kode kerja nyata, jika Anda bisa memilikinya!
Terima kasih!
@pythonfun0 Anda tidak melihat apa yang kami coba tunjukkan.
Anda mengetik ini:
polygon = asShape({'type': "Polygon", "coordinates": [(0,0), (0,1), (1,1), (1,0), (0,0)]})
Anda harus mengetik ini:
polygon = asShape({'type': "Polygon", "coordinates": [[(0,0), (0,1), (1,1), (1,0), (0,0)]]})
Meskipun poligon Anda hanya memiliki cincin bagian luar dan tidak ada cincin bagian dalam, Anda tetap harus melewati daftar bersarang.
Saya sudah mengerti, maaf saya membaca jawaban Anda tanpa sadar. Daftar daftar koordinat bekerja dengan sempurna.
Terima kasih!
Komentar yang paling membantu
Contoh-contoh ini tidak menggunakan WKT. http://toblerity.org/shapely/manual.html#well -known-formats
Mereka menggunakan representasi __geo_interface__ dari geometri, yang baik-baik saja.
Alasan poligon Anda gagal adalah karena tidak valid. Urutan koordinat poligon harus berupa daftar daftar koordinat, bukan daftar koordinat seperti yang Anda miliki. Ini karena poligon terdiri dari beberapa cincin linier - cincin eksterior, dan beberapa cincin interior opsional.
Kode berikut berfungsi. Perhatikan tanda kurung tambahan di koordinat.
Perhatikan juga bahwa jika Anda tidak menggunakan array numpy untuk koordinat, Anda juga bisa menggunakan
shape()
alih-alihasShape()
. Dalam hal ini kesalahan segera muncul, bukan ketika Anda mencoba mengakses data. http://toblerity.org/shapely/shapely.geometry.html#shapely.geometry.asShape