使用shapely/python围绕一组(非相交)多边形绘制多边形
我正在使用谷歌地图创建一个显示财产边界的多边形集合——所有这些都在一个图层上。多边形可能包括一个特性不接触相邻特性的间隙。它们既不接触也不相交。 我想使用python和shapely创建一个多边形,封装层中的所有多边形。 我已从KML文件中提取了所有多边形坐标,并成功创建了一个形状优美的“封套”,如图所示(灰色阴影-属性多边形为彩色): 我不想在房子周围有个盒子。我实际上想要的是一个紧多边形围绕着这组多边形,类似这样的东西(蓝色线的位置): 我试过级联联、凸包联、一元联和线性化,但都没有用。有人能给我指出我需要使用的功能的正确方向吗 我的代码片段是:使用shapely/python围绕一组(非相交)多边形绘制多边形,python,google-maps,polygon,kml,shapely,Python,Google Maps,Polygon,Kml,Shapely,我正在使用谷歌地图创建一个显示财产边界的多边形集合——所有这些都在一个图层上。多边形可能包括一个特性不接触相邻特性的间隙。它们既不接触也不相交。 我想使用python和shapely创建一个多边形,封装层中的所有多边形。 我已从KML文件中提取了所有多边形坐标,并成功创建了一个形状优美的“封套”,如图所示(灰色阴影-属性多边形为彩色): 我不想在房子周围有个盒子。我实际上想要的是一个紧多边形围绕着这组多边形,类似这样的东西(蓝色线的位置): 我试过级联联、凸包联、一元联和线性化,但都没有用。
coordinates = []
def getAllPolys(XmlFile, XmlNS, XPath):
tree = etree.parse(XmlFile)
root = tree.getroot()
XmlNamespace = {"NS": XmlNS}
xmlList = root.xpath(XPath, namespaces=XmlNamespace)
if not xmlList:
return(False)
for p in xmlList:
polyCoordList = p.text.replace(' ', '')
for point_text in polyCoordList.split():
floats = point_text.split(",")
coordinates.append(geometry.Point(float(floats[0]), float(floats[1])))
def processEnvelope():
e = geometry.MultiPoint([[p.x, p.y] for p in coordinates]).envelope
L = list(e.exterior.coords)
for x,y in L:
print(str(x) + "," + str(y) + ",0")
XPath = "./NS:Document/NS:Folder[contains(., 'Property')]/NS:Placemark/NS:Polygon/NS:outerBoundaryIs/NS:LinearRing/NS:coordinates"
getAllPolys(XmlFile, XmlNS, XPath)
XPath = "./NS:Document/NS:Folder[contains(., 'Property')]/NS:Placemark/NS:MultiGeometry/NS:Polygon/NS:outerBoundaryIs/NS:LinearRing/NS:coordinates"
getAllPolys(XmlFile, XmlNS, XPath)
processEnvelope()
看来我需要一个字母形状。我的样本数据最初包含221个多边形,这似乎使我尝试的任何alphashape算法都不准确(无法在图形周围绘制准确的边框)。然后,我通过寻找多边形相交并通过一元并集将它们合并,将多边形的数量压缩到50个。这使得alphashape工作更可靠,但仍然不够完美。我认为图形的锯齿状边缘对于算法来说太复杂了。我用许多不同的alpha值尝试了alphashape函数。欢迎任何建议。