การแปลงรูปวัตถุ Shapely Polygon และ MultiPolygon


26

มีวิธีง่าย ๆ ในการแปลงวัตถุรูปร่างดี (คือ Polygons และ MultiPolygons) จากการฉายภาพหนึ่งไปยังอีกภาพหนึ่งโดยไม่ต้องขุดไปรอบ ๆ และแยกพิกัดด้วยมือหรือไม่?

ในความเป็นจริงฉันไม่สนใจว่าพวกเขาจะเป็นวัตถุที่มีรูปร่างดีในตอนนี้ฉันแค่ต้องการส่งผ่านฟีเจอร์และการฉายภาพ

ฟังก์ชั่นประเภทนี้มีอยู่หรือไม่หรือต้องมีการเข้ารหัสด้วยมือหรือไม่?


2
ฉันเชื่อว่าอยู่นอกขอบเขตของหุ่นดีคุณอาจต้องการมองหาฟิโอน่า fiona.transformดูเหมือนจะมีสิ่งที่คุณต้องการ
Jason Scheirer

คำตอบ:


50

แม้ว่าหุ่นดีจะไม่เข้าใจระบบพิกัด แต่ shapely.ops.transform()ก็สามารถทำได้เช่นpyprojกัน หากpyproj.Projสามารถเข้าใจระบบพิกัดทั้งสองของคุณได้ระบบสามารถทำให้เป็นฟังก์ชันที่สามารถแปลงร่างได้ด้วย

จากเอกสารหุ่นดี:

from functools import partial
import pyproj
from shapely.ops import transform

project = partial(
    pyproj.transform,
    pyproj.Proj(init='epsg:4326'), # source coordinate system
    pyproj.Proj(init='epsg:26913')) # destination coordinate system

g2 = transform(project, g1)  # apply projection

4
หากคุณไม่ต้องการที่จะใช้itertoolsโมดูลที่คุณสามารถทำได้แล้วproject = lambda x, y: pyproj.transform(pyproj.Proj(init='epsg:4326'), pyproj.Proj(init='epsg:26913'), x, y) g2 = transform(project, g1)
Elmex80s

1
คำตอบของปัญหานี้สำหรับ pyproj1 ขณะที่มีในขณะนี้คือการเปลี่ยนแปลงที่แนะนำสำหรับ pyproj2 Transformerใช้ ดูที่นี่: pyproj4.github.io/pyproj/stable/gotchas.html
Thirst for Knowledge

11

ในขณะที่ไม่ได้เป็นโซลูชั่นที่ดีมากการใช้ GeoPandas ช่วยให้การฉายภาพค่อนข้างตรงไปตรงมา ตัวอย่างเช่นถ้าเราต้องการแปลง shapefile เป็น ESPG 4326:

import geopandas as gpd

HabModelEnviro = gpd.GeoDataFrame.from_file('data/HabModelEnviro.shp').replace({-999: None})

HabModelEnviroWGS84 = HabModelEnviro.to_crs({'proj':'longlat', 'ellps':'WGS84', 'datum':'WGS84'})

6
Geopandas ใช้ Shapely (ดูตัวอย่าง geodataframe.py)
ยีน

0

หากคุณใช้ pyproj2 การใช้งาน Transformer นั้นง่ายกว่ามาก นี่คือตัวอย่าง:

import pyproj
from shapely.ops import transform

project = pyproj.Transformer.from_proj(
    pyproj.Proj(init='epsg:4326'), # source coordinate system
    pyproj.Proj(init='epsg:26913')) # destination coordinate system

# g1 is a shapley Polygon

g2 = transform(project.transform, g1)  # apply projection

นอกจากนี้ยังเร็วกว่ามากเนื่องจาก pyproj ไม่จำเป็นต้องสร้างการฉายใหม่สำหรับทุกจุด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.