Uluslararası tarih boyunca çokgenler [-180 .. + 180 boylam]


10

Uydu yörünge biçimleri için çokgenler üretmeye çalışıyorum. Şimdiye kadar [lat, long] her bir alanın kenarını temsil eden iki çizgi oluşturmak için bir yöntemim var. Bazı dallar uluslararası datelini geçiyor ve etrafı sarıyorlar:

sarılmak

Bunu şu şekilde çözebildim ogr2ogr -wrapdateline:

ogr2ogr -wrapdateline  -f "ESRI Shapefile" test.shp orbits.shp

Muhtemelen çizgileri bölüyor

Şimdi her iki çizginin iç kısmında çokgenler oluşturmak istiyorum. Örneğin, örneğin, kenarın bir kenarının dateline geçtiği durumda, bir çokgen diğer tarafta ortaya çıktığında doldurulur, örneğin:

dolgu

Görevi çok tekrarlamam gerektiği için otomatikleştirilmiş bir yönteme ihtiyacım var. Tercihen python olarak ben nasıl hatları oluşturduk. Çizgileri içeren iki şekil dosyası şunlardır: wraparound ; datelinefixed


Ek fikirler için gis.stackexchange.com/questions/429 ve gis.stackexchange.com/questions/18562 adresindeki ilgili konulara bakın . Muhtemelen gis.stackexchange.com/questions/17788'de sunulan fikirler de yardımcı olabilir. Yine de merak ediyorum, "iç" ile ne demek istediğinizi: bu çokgenler iyi tanımlanmamıştır, bu nedenle en azından (a) her çoklu çizginin hangi tarafının "iç" ve (b) onları kutupların yakınında kesmek için.
whuber

Yanıtlar:


3

Yaklaşık olarak alanın merkezine ortalanmış özel bir mercator projeksiyonu oluşturabilirsiniz. Örneğin, alan 25 için kullanın:

+proj=merc +lon_0=-140 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs

Bu projeksiyonda, alan datelin tarafından kırılmaz. Çokgeni çizgiden oluşturabilirsiniz.

resim açıklamasını buraya girin

Sonra EPSG: 4326'da -179.95 ° E ve 179.95 ° E arasında bir kesim çokgen oluşturun:

Nr;WKT
1;POLYGON ((-179.95 89, 179.95 89, 179.95 -89, -179.95 -89, -179.95 89))

Özel CRS'nize de yeniden yerleştirin ve swath poligonundan çıkarın.

EPSG: 4326'ya yeniden enjeksiyon yaptıktan sonra, alan doğru şekilde dateline bölünür:

resim açıklamasını buraya girin

Datelini geçen tüm alanlara devam edin.


1

Aynı sürekli uzunlamasına alanda başlamak ve bitirmek için swathe hattı oluşturma sürecini yeniden yazardım. yani 170 ° 'de başlayan ve -170 °' de biten bir çizgi -180,180 değerine sarılmak yerine 190 ° 'de bitirmek için işlemi yeniden yazarım

Ardından çizgileriniz arasında kesintisiz çokgenler yapabilirsiniz.

Daha sonra 180, -180 çizgisindeki çokgenleri ayırmak ve uygun şekilde 360 ​​° ekleyerek veya çıkararak -180,180 alanının dışında kalan parçaları kaydırmak için bir klip işlemi kullanın.

Belirli bir projeksiyon / datum ile kaydetmeden önce her şeyi halledin


1

Bu fikir için @AndreJ sayesinde, burada Django GEOS API'sini kullanmak, herhangi bir şeyi yeniden yansıtmaktan kaçınan basit bir çözümdür:

1) Veri üzerinde sınır oluşturan bir MultiPolygon oluşturun:

from django.contrib.gis.geos.collections import MultiPolygon, LinearRing, Polygon
box1 = ((180.0, 89), (179.95, 89), (179.95, -89), (180.0, -89), (180.0, 89))
box2 = ((-180.0, 89), (-179.95, 89), (-179.95, -89), (-180.0, -89), (-180.0, 89))
poly1 = Polygon(LinearRing(box1))
poly2 = Polygon(LinearRing(box2))
poly = MultiPolygon(poly1, poly2)

2) Sorun yaratan geometri kesişirse, farkı döndürün:

from django.contrib.gis.geos.geometry import GEOSGeometry
geometry = GEOSGeometry(WKT)  # WKT is your polygon in WKT string format
if geometry.intersects(poly):
    print("Geometry crosses dateline... splitting")
    geometry = geometry.difference(poly) # clip with dateline polygon

Sonuç aşağıdaki gibi gösterilir:

Önce

Sonra

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.