点列の距離を計算する方法は?


8

QGISの単一のシェープファイルにある一連のポイント間の距離を計算するのに役立つ情報を探しています。以下は、私のデータの外観と、距離をどのように表示するかを示すために追加した空白の距離列です。ポイント1と2、2と3の間の距離などを知りたい。距離をメートルまたはKm単位で取得したいが、現在、Shapefileの投影は、単位が10進度である。

ID  LAT         LON         TIME        DISTANCE
1   10.08527    124.59833   21:24:37    0
2   10.08523    124.59830   21:25:07    ?
3   10.08526    124.59832   21:25:37    ?
4   10.08526    124.59831   21:26:07    ?

多くの人が同様の質問をしましたが、私がやりたいことについてまったく理解していません。この投稿は近いですが、これはQGISではなくPostGISにあり ます。Postgisの一連のポイント間の距離を計算します

この投稿は私にその道の一部をもたらしましたが、私はQGISを初めて使用しているので、答えは私に十分な詳細を提供しません。たとえば、GRASSプラグインをインストールしたら、Shapefileを一連のGPSポイントとともにGRASSに保存/インポートして、v.distanceモジュールを使用できるようにする必要があると思いますが、その方法がわかりません。 QGISは線に沿った点の距離を計算します

GRASS v.distanceモジュールが唯一の方法ですか?またはもっと簡単な方法はありますか?v.distanceが唯一の方法である場合、誰かが私にこれを指示したり、これを行う方法を段階的に説明したりできますか?


@underdarkどうすればそれをExcelで実行できますか?
user2207232 2013年

回答:


8

それは非常によく似ているので、私はこの問題に戻って、私はQGISやGRASSのベクトルラインのベアリングを見つけるにはどうすればよいですか?そしてそれは同じようにPythonで解決できます:

1)ハバシン距離

インターネット上のPythonでHaversine距離を検索することで多くのスクリプトを見つけることができ、私はそれらの1つをPythonのHaversine Formula(ベアリングと2つのGPSポイント間の距離)で選択します

def haversine(lon1, lat1, lon2, lat2):
    """
    Calculate the great circle distance between two points 
    on the earth (specified in decimal degrees)
    """
    # convert decimal degrees to radians 
    lon1, lat1, lon2, lat2 = map(math.radians, [lon1, lat1, lon2, lat2])
    # haversine formula 
    dlon = lon2 - lon1 
    dlat = lat2 - lat1 
    a = math.sin(dlat/2)**2 + math.cos(lat1) * math.cos(lat2) * math.sin(dlon/2)**2
    c = 2 * math.asin(math.sqrt(a)) 
    km = 6367 * c
    return km

ファイルには、距離を計算するためにペア(point1-point2)で処理する必要がある一連の線(ポイント)があります。このために、ほとんどのpythonic方法の単純なイテレータを使用して、前の要素を取得します

def offset(iterable):
    prev = None
    for elem in iterable:
        yield prev, elem
        prev = elem

これで、ライン/ポイントのペアでファイル(Kerrieの例)を読み取ることができます

import csv
with open('testhavers.csv', 'rb') as f:
   reader = csv.DictReader(f)
   for  pair in offset(reader):
       print pair

 (None, {'LAT': '10.08527', 'LON': '124.59833', 'ID': '1', 'TIME': '21:24:37'})
 ({'LAT': '10.08527', 'LON': '124.59833', 'ID': '1', 'TIME': '21:24:37'},
 {'LAT':    '10.08523', 'LON': '124.59830', 'ID': '2', 'TIME': '21:25:07'})
 ({'LAT': '10.08523', 'LON': '124.59830', 'ID': '2', 'TIME': '21:25:07'}, 
 {'LAT': '10.08526', 'LON': '124.59832', 'ID': '3', 'TIME': '21:25:37'})
 ({'LAT': '10.08526', 'LON': '124.59832', 'ID': '3', 'TIME': '21:25:37'}, 
 {'LAT':    '10.08526', 'LON': '124.59831', 'ID': '4', 'TIME': '21:26:07'})

次に、csvファイルの元のフィールドと、PythonモジュールShapelyおよびFiona of Sean Gilliesを使用して距離の新しいフィールドを含むシェープファイルを作成します。

import fiona
from shapely.geometry import Point, mapping
# creation of the schema of the shapefile (geometry and fields)
schema = { 'geometry': 'Point', 'properties':{'ID': 'int', 'LAT':'float', 'LON':'float', 'TIME':'str','distance' : 'float'}}
# creation of the shapefile:
with fiona.collection("result.shp", "w", "ESRI Shapefile", schema) as output:
    # reading the csv file
    with open('testhavers.csv', 'rb') as f:
       reader = csv.DictReader(f)
       # we need here to eliminate the first pair of point with None
       for i, pair in enumerate(offset(reader)):
            if i == 0: (pair with None)
                # writing of the point geometry and the attributes
                point = Point(float(pair[1]['LON']), float(pair[1]['LAT']))
                dist = 0 # None
                output.write({'properties': {'ID':int(pair[1]['ID']),'LAT':float(pair[1]['LAT']),'LON':float(pair[1]['LON']), 'TIME':pair[1]['TIME'],'distance': dist},'geometry': mapping(point)})
             else:
                # writing of the point geometry and the attributes
                point = Point(float(pair[1]['LON']), float(pair[1]['LAT']))
                # Haversine distance between pairs of points
                dist = haversine(float(pair[0]['LON']), float(pair[0]['LAT']), float(pair[1]['LON']),float(pair[1]['LAT']))
                output.write({'properties': {'ID':int(pair[1]['ID']),'LAT':float(pair[1]['LAT']),'LON':float(pair[1]['LON']), 'TIME':pair[1]['TIME'],'distance': dist},'geometry': mapping(point)})

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

PyQGISでそれを行うことも可能ですが、シンプルな辞書を使用してシェープファイルを作成するFionaよりも複雑です。

別の関数を使用して、Haversine距離を計算できます(2つの緯度と経度のポイント間の距離を計算するときに、コサインの法則が hasrsine よりも好ましいのはなぜですか?)、問題なく、距離計算のみが変更され、シェープファイルの作成プロセスは変更されません。


5

rに慣れている場合は、「sp」パッケージと「dismo」パッケージの組み合わせを使用してみてください。

たとえば、次のようになります(x、y座標のポイントがあると想定)。

library(sp)
library(dismo)

data <- read.csv2(..) # Read in your data
coordinates(data) <- ~x+y # point them to your coordinates to make a spatialpoint layer
# Or like this:
Pointlayer <- SpatialPoints(cbind(data$x,data$y))


# then calculate your distance matrix your point sequence
d <- pointDistance(pp,longlat=F)

# Looks for example like this:
head(d)
          [,1]     [,2]     [,3]     [,4]     [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
[1,]  0.000000       NA       NA       NA       NA   NA   NA   NA   NA    NA    NA    NA
[2,] 54.561891  0.00000       NA       NA       NA   NA   NA   NA   NA    NA    NA    NA
[3,] 25.000000 73.49830  0.00000       NA       NA   NA   NA   NA   NA    NA    NA    NA
[4,] 50.487622 43.93177 53.14132  0.00000       NA   NA   NA   NA   NA    NA    NA    NA
[5,]  4.123106 57.00877 26.30589 54.58938  0.00000   NA   NA   NA   NA    NA    NA    NA
[6,] 32.249031 37.21559 57.14018 60.30755 32.01562    0   NA   NA   NA    NA    NA    NA

#More information about the method in dismo package help

3

おそらく、距離行列ツールが役立つでしょうか?[ベクター]メニューの下にあります。各ポイントについて、他の各ポイントまでの距離を計算し、結果をCSVファイルに保存します。

メートル単位の距離が必要な場合は、ツールを使用する前に、緯度/経度から投影されたシェープファイル(場合によってはUTM51)にポイントを変換することは理にかなっていると思います。

N


0

使用v.to.dbオプション=長さ(ライン長)とGRASS(例えば経由Sextanteプラグイン)。

各ベクターラインのライン長(メートル単位)を属性テーブルにアップロードする例(GUIの対応するフィールドに入力します):

v.to.db map=roads option=length type=line col=linelength units=me


0

この問題は、スプレッドシートで作業することで最も簡単に解決できると思います。GIは使用しないでください。私はクリス・ベネスの仕事がとても役に立ったと感じました-

http://www.movable-type.co.uk/scripts/latlong.html

下の段落をスクロールすると、2つのExcelシートへのリンクがあります。

http://www.movable-type.co.uk/scripts/latlong-distance+bearing.xls

http://www.movable-type.co.uk/scripts/latlong-dest-point.xls

も参照してください。

2つの緯度と経度のポイント間の距離を計算するときに、コサインの法則がhasrsineよりも望ましいのはなぜですか?

そして、gis.seでhaversineを検索できます。

乾杯


シェープファイルからスプレッドシートにデータを取得するのに助けが必要ですか?
Willy
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.