Shapely: tidak mungkin membuat objek yang indah dari wkt

Dibuat pada 6 Feb 2017  ·  7Komentar  ·  Sumber: Toblerity/Shapely

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()

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.

>>> 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

Semua 7 komentar

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!

Apakah halaman ini membantu?
0 / 5 - 0 peringkat