跨国际日期变更线的多边形[-180 .. + 180经度]


10

我正在尝试为卫星轨道条带生成多边形。到目前为止,我有一种方法可以生成两条线,以[lat,long]表示每个条带的边缘。一些条带跨越了国际日期变更线,因此绕了一下:

缠绕

我能够通过以下方式解决此问题ogr2ogr -wrapdateline

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

哪条线可能会分开

现在,我希望能够在两条线的内部生成多边形。因此,例如,在条幅的一个边缘与日期线交叉的情况下,当多边形出现在另一侧时会填充该多边形,例如:

填

我需要一种自动化的方法,因为我需要重复很多次任务。最好在python中,因为那是我生成线的方式。这是包含这些行的两个shapefile:wraparound ; datelinefixed


有关其他想法,请参见gis.stackexchange.com/questions/429gis.stackexchange.com/questions/18562中的相关线程。可以想象,gis.stackexchange.com / questions / 17788中提出的想法也可能会有所帮助。不过,我想知道您所说的“内部”是什么意思:这些多边形的定义不明确,因此至少需要提供信息以表明(a)每条折线的哪一侧被视为“内部”,以及(b)如何在两极附近切断它们。
whuber

Answers:


3

您可以建立一个自定的墨卡托投影,其中心大约位于条带的中心。例如,用于条带25:

+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

在此投影中,日期线不会中断条带。您可以从直线创建多边形。

在此处输入图片说明

然后在EPSG:4326中在-179.95°E和179.95°E之间创建一个切割面:

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

也将其重新投影到您的自定义CRS,然后从条幅多边形中减去它。

重新投影回EPSG:4326之后,条幅正确地按日期线划分了:

在此处输入图片说明

继续进行所有跨越日期线的内容。


1

我将重写缠绕线生成过程,以在同一连续的纵向空间中开始和结束。例如,如果一条线从170°开始并在-170°结束,我将重写该过程以在190°完成,而不是在-180,180处换行

然后,您可以在线条之间制作不间断的多边形。

然后使用剪切过程在180,-180线处分割多边形,并通过适当地增加或减少360°来移动-180,180空间之外的任何部分。

在保存特定的投影/基准之前,只需完成所有操作即可


1

感谢@AndreJ的这个想法,这里使用Django GEOS API是一个简单的解决方案,避免了重新投影任何事情:

1)创建一个在日期线上加上边框的MultiPolygon:

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)如果有问题的几何相交,则返回差值:

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

结果如下:

之前

后

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.