1

NetworkX を手に取り、Shapefiles でそれを使用する方法を学ぼうとしています。

現在、2 つの GPS ポイント間の最短経路を見つけることができるように、NetworkX を使用してグラフで表現したい道路網を含む .shp があります。これを使用してみましたが、問題は、write_shp() 関数を実行すると、DiGraph では同じ 2 つのノード間で複数のエッジが許可されないため、エッジが失われることです。下図の矢印は、DiGraph を使用してエッジを失った例を示しています。

ここに画像の説明を入力

そのため、エッジを失わないように MultiDiGraph を作成する方法があるかどうか、またはその周りに使用できる方法があるかどうか疑問に思っていました。NetworkX の read_shp() を使用せずに、Shapefile から属性を抽出して MultiDiGraph を作成するコードを記述できるのではないかと考えていましたが、グラフを操作した経験がまったくないため、それが正確かどうかはわかりません。可能でしょう。

ヘルプやガイダンスをいただければ幸いです。また、不足しているドキュメントがありましたらお知らせください。前もって感謝します。

4

3 に答える 3

3

あなたの質問から私が従うことができる限り、基本的に元のread_shpコマンドからコピーされた以下がそれを行います。

def read_multi_shp(path):
    """
    copied from read_shp, but allowing MultiDiGraph instead.
    """
    try:
        from osgeo import ogr
    except ImportError:
        raise ImportError("read_shp requires OGR: http://www.gdal.org/")

    net = nx.MultiDiGraph() # <--- here is the main change I made

    def getfieldinfo(lyr, feature, flds):
            f = feature
            return [f.GetField(f.GetFieldIndex(x)) for x in flds]

    def addlyr(lyr, fields):
        for findex in xrange(lyr.GetFeatureCount()):
            f = lyr.GetFeature(findex)
            flddata = getfieldinfo(lyr, f, fields)
            g = f.geometry()
            attributes = dict(zip(fields, flddata))
            attributes["ShpName"] = lyr.GetName()
            if g.GetGeometryType() == 1:  # point
                net.add_node((g.GetPoint_2D(0)), attributes)
            if g.GetGeometryType() == 2:  # linestring
                attributes["Wkb"] = g.ExportToWkb()
                attributes["Wkt"] = g.ExportToWkt()
                attributes["Json"] = g.ExportToJson()
                last = g.GetPointCount() - 1
                net.add_edge(g.GetPoint_2D(0), g.GetPoint_2D(last), attr_dict=attributes) #<--- also changed this line

    if isinstance(path, str):
        shp = ogr.Open(path)
        lyrcount = shp.GetLayerCount()  # multiple layers indicate a directory
        for lyrindex in xrange(lyrcount):
            lyr = shp.GetLayerByIndex(lyrindex)
            flds = [x.GetName() for x in lyr.schema]
            addlyr(lyr, flds)
    return net

返されたグラフを aDiGraphから aに変更しました。バージョンの構文が とは異なるため、コマンドMultiDigraphを変更する必要がありました。add_edgeMultiDiGraphDiGraph

于 2015-06-11T03:19:00.543 に答える
1

マルチラインがジョイントで切断されている場合は、このライブラリpython-s2g( https://github.com/caesar0301/python-s2g ) が役立つと思います。networkx の Graph オブジェクトが内部で使用されていても、これらのマルチパスは実際にはグラフ データによって記録されます。

于 2016-12-15T13:47:59.810 に答える