3

大縮尺地図から小縮尺地図までの一般化された道路網地図を取得するために適用される線の一般化について研究しています。私は2つの操作と2つのアルゴリズムを使用しています。これは、シェープファイルライブラリを使用してPythonプログラミング言語で実行されます。2Dのベクターデータ用です。操作:選択と削除。選択には、すべての道路、選択された幅が7メートルを超える、道路の属性機能に接続されているなどの条件を使用しています。除去と同じように、すべての道路と同様に、幅が5メートル未満で除去されます。これまでのところ、それほど問題はありませんでした。

選択と削除の操作が適用された後、条件を通過した道路のシェープファイルが作成されます。私は2つのアルゴリズム、線の単純化と線の平滑化を使用しています。線を単純化するために、私はDouglas-Peuckerの線単純化アルゴリズムを使用しています。ベクトルデータ(座標)を取得し、許容値に基づいていくつかのポイントを削除します。私はPythonプログラミング言語を使用してそれを行っています。簡略化された線を取得した後、線の平滑化などの編集が必要です。ここでは、ガウスのアルゴリズムを使用していますが、プログラミング環境に慣れていないため、理解できないエラーが返されます。

import numpy

 ### This is the Gaussian data smoothing function I wrote ###  

def smoothListGaussian(list1,degree):  

     window=degree*2-1  

     weight=numpy.array([1.0]*window)
     print weight

     weightGauss=[]  

     for i in range(window):  

         i=i-degree+1  

         frac=i/float(window)  

         gauss=1/(numpy.exp((4*(frac))**2))  

         weightGauss.append(gauss)  

     print weightGauss
     weight=numpy.array(weightGauss)*weight
     print weight
     print len(list1)-window


     smoothed=[0.0]*(len(list1)-window)
     print smoothed

     for i in range(len(smoothed)):  

         smoothed[i]=sum(numpy.array(list1[i:i+window])*weight)/sum(weight)  

     return smoothed


a=[[78.03881018900006, 30.315651467000066], [78.044901609000078, 30.31512798600005], [78.04927981700007, 30.312510579000048], [78.050041244000056, 30.301755415000059], [78.072646124000073, 30.281720353000082], [78.07902308000007, 30.273344651000059]]

smoothListGaussian(a,3)

何か、アイデアをお願いします。または、ラインの各ポイントの座標を使用してベクトルデータのラインを平滑化するPythonの他のアルゴリズムがある場合

どんな答えもありがたいです!

4

2 に答える 2

16

次のコードでパスをスムーズにできます。

from scipy.ndimage import gaussian_filter1d
import numpy as np
a=np.array([[78.03881018900006, 30.315651467000066],
 [78.044901609000078, 30.31512798600005], 
 [78.04927981700007, 30.312510579000048],
 [78.050041244000056, 30.301755415000059],
 [78.072646124000073, 30.281720353000082],
 [78.07902308000007, 30.273344651000059]])

x, y = a.T
t = np.linspace(0, 1, len(x))
t2 = np.linspace(0, 1, 100)

x2 = np.interp(t2, t, x)
y2 = np.interp(t2, t, y)
sigma = 10
x3 = gaussian_filter1d(x2, sigma)
y3 = gaussian_filter1d(y2, sigma)

x4 = np.interp(t, t2, x3)
y4 = np.interp(t, t2, y3)

plot(x, y, "o-", lw=2)
plot(x3, y3, "r", lw=2)
plot(x4, y4, "o", lw=2)

結果は次のとおりです。青い点は元のデータ、赤い曲線は多くのポイントを含む平滑化された曲線です。元のデータと同じポイント数が必要な場合は、赤い曲線からサンプリングして緑のポイントを取得できます。

sigmaのスムーズレベルを変更するように設定できますgaussian_filter1d()

ここに画像の説明を入力してください

于 2013-03-02T22:20:10.563 に答える
1

ここからのコードを使用したと思います。コードは多次元データポイントではなく、単一次元データポイント用であることに注意する必要があります。

私はガウス平滑化アルゴリズムについてあまりよく知りませんが、コードを簡単に調べただけで、次のことがあなたがやろうとしていることだと思います(それがあなたが望む結果をもたらすかどうかはわかりません)。コードの最後の部分を次のコードに置き換えます。

smoothed=[0.0,0.0]*(len(list1)-window)
print smoothed

for i in range(len(smoothed)):
    smoothing=[0.0,0.0]
    for e,w in zip(list1[i:i+window],weight):
        smoothing=smoothing+numpy.multiply(e,w)
    smoothed[i]=smoothing/sum(weight)
于 2013-03-02T19:52:33.170 に答える