XML/KML - 如何在 bash 脚本中测试多边形是否“接触”另一个多边形

如何解决XML/KML - 如何在 bash 脚本中测试多边形是否“接触”另一个多边形

我正在使用 Google 我的地图在一个图层上绘制郊区(作为多边形),然后在第二层上绘制该郊区内和周围存在的所有(农村)属性(也作为多边形)。多边形使用地理坐标来定义点。例如(有些编辑):

        <polygon>
          <outerBoundaryIs>
            <LinearRing>
              <tessellate>1</tessellate>
              <coordinates>
                150.523000,-34.720000,0
                150.524000,-34.719000,0
                150.523000,0
              </coordinates>
            </LinearRing>
          </outerBoundaryIs>
        </polygon>

然后我使用 bash 脚本修改 XML/KML 以满足我的要求。

我希望有人能有一个神奇的子弹,通过命令行,允许我指定一个 XML 文件和两个多边形的 XPATH(在 XML 文件中),并让它告诉我两个多边形是否相交 -类似:

check_polygons "/path/to/XML" "//_:xpath/to/polygon1" "//_:xpath/to/polygon2"

它以某种方式(文本或退出状态)告诉我两个多边形是否在任何点相交。

非常感谢任何帮助。

解决方法

感谢 Paul Hodges 给了我一个鼓励,让我努力想出一个解决方案。

这非常适合我使用 Google 我的地图创建具有两层的地图的情况。第一层名为“Locality”,是一个映射郊区的多边形。第二层名为“Property”,包含多个映射属性边界的多边形。

下面的脚本需要 2 或 3 个参数。第一个(可选)参数是 XML 命名空间(默认为 http://www.opengis.net/kml/2.2),第二个参数是“属性”图层上地标的名称,最后一个参数是 KML 文件名。该脚本检查两个多边形是否相交。如果是,则打印 True 并返回 0(零)代码。如果它们不相交,它会打印 False 并且返回码为 1。返回码为 2 表示在 XML 文件中找不到 XPath 或存在使用错误。

#!/usr/bin/python

from lxml import etree
from shapely.geometry import Polygon
import sys


def getPoly(XmlFile,XmlNS,XPath):
    tree = etree.parse(XmlFile)
    root = tree.getroot()
    XmlNamespace = {"NS": XmlNS}
    xmlList = root.xpath(XPath,namespaces=XmlNamespace)
    if not xmlList:
        return(False)
    polyCoordList = xmlList[0].text.replace(' ','')
    coordinates = []
    for point_text in polyCoordList.split():
      floats = point_text.split(",")
      coordinates.append((float(floats[0]),float(floats[1])))
    return(Polygon(coordinates))



if __name__ == "__main__":
    XmlNS = "http://www.opengis.net/kml/2.2"
    if len(sys.argv) == 4:
        XmlNS = sys.argv[1]
        XmlPlacemarkName = sys.argv[2]
        XmlFile = sys.argv[3]
    elif len(sys.argv) == 3:
        XmlPlacemarkName = sys.argv[1]
        XmlFile = sys.argv[2]
    else:
        print("Usage: %s [NameSpace] PlacemarkName KmlFile" % (sys.argv[0]))
        print("The default namespace is %s" % XmlNS)
        exit(2)


    XPath = "./NS:Document/NS:Folder[contains(.,'Locality')]/NS:Placemark/NS:Polygon/NS:outerBoundaryIs/NS:LinearRing/NS:coordinates"
    LocalityPoly = getPoly(XmlFile,XPath)
    if LocalityPoly == False:
        print("Invalid XPath - %s" % XPath)
        exit(2)
    XPath = "./NS:Document/NS:Folder[contains(.,'Property')]/NS:Placemark[contains(.,'%s')]/NS:Polygon/NS:outerBoundaryIs/NS:LinearRing/NS:coordinates" % XmlPlacemarkName
    PlacemarkPoly = getPoly(XmlFile,XPath)
    if PlacemarkPoly == False:
        XPath = "./NS:Document/NS:Folder[contains(.,'%s')]/NS:MultiGeometry/NS:Polygon/NS:outerBoundaryIs/NS:LinearRing/NS:coordinates" % XmlPlacemarkName
        PlacemarkPoly = getPoly(XmlFile,XPath)
        if PlacemarkPoly == False:
            print("Invalid XPath - %s" % XPath)
            exit(2)
    result = LocalityPoly.intersects(PlacemarkPoly)
    print(result)
    exit(not result)

希望可以帮助别人。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?