2015-10-25 25 views
6

我有一些來自gps數據(Lat,Lon)的數據點和我正在考慮的區域的相對shapefile。所以:Python:指向道路shapefile

import pandas as pd 
import shapefile 
sf = shapefile.Reader('roadshape') 
df = pd.read_csv('gpsdata.csv') 

現在df包含我分析的數據是這樣的:

ID   x   y 
3447 11.400427 48.816806 
3448 11.400759 48.816772 
3449 11.401424 48.816684 
3450 11.401758 48.816631 
3451 11.402090 48.816566 
3452 11.402422 48.816490 

我要分配給每個相應的shapefile段。我正在嘗試做以下事情。我正在考慮邊界框,我想嘗試查看哪個邊界框數據指向數據欄。

dfs = pd.DataFrame() 
shapes = sf.shapes() 
X =list() 
Y=list() 
for i in range(0,len(shapes)): 
     X.append([shapes[i].bbox[0],shapes[i].bbox[2]]) 
     Y.append([shapes[i].bbox[1],shapes[i].bbox[3]]) 
dfs['X'] = X 
dfs['Y'] = Y 

現在我該如何檢查我的要點是哪個bbox?其中dfs是這樣的

dfs = 
       X        Y 
0 [10.9467244189, 10.9704393002] [48.2671975178, 48.2697440003] 
1 [11.5138847999, 11.5143541004] [48.6497096997, 48.6515363002] 
2 [11.4618209998, 11.4620896004] [48.9305448001, 48.9307776004] 
3 [10.6196591004, 10.6207268996] [48.8635958001, 48.8665684003] 
4 [10.652098, 10.6559025999] [48.8005320998, 48.8042877999] 
5 [11.1863882997, 11.1884544004] [48.3726685999, 48.3738253996] 
6 [11.1580075998, 11.1593822] [48.3785226999, 48.3791247996] 
7 [11.1077987, 11.1112508996] [48.3829125003, 48.3830440999] 
8 [11.0842697004, 11.0886483996] [48.3840543003, 48.3879626001] 
9 [11.0910959001, 11.0926532003] [48.3903297003, 48.3916850002] 
10 [11.4766434001, 11.4822778002] [49.0389071001, 49.0399456003] 
11 [11.7037148998, 11.7073818] [48.6927748996, 48.6961230001] 
12 [11.7767894997, 11.7770049998] [48.6279809001, 48.6279908997] 
+0

我是否理解形狀[i] .bbox [0]是最左邊的X座標,bbox [1] - 頂部Y座標,bbox [2] - 右邊X,bbox [3] - 底部Y.這兩個點定義邊界框?結果你想得到從每個GPS點映射到相應BBOX的字典(例如)? –

+0

還有更健壯的模塊,比如造型,菲奧娜,ogr來處理幾何! – SIslam

+0

你有任何更新?你可以使熊貓df(邊界)適應我的csv! – SIslam

回答

3

我會去fiona,勻稱和內置csv!

說我有兩個文件:1)一個linefile文件中有幾行記錄。 2)具有三列的CSV文件,即ID,經度(X),緯度(Y)

CSV文件內容(緯度,經度是UTM) -

id,lat,long 

0,207726.012448,2733349.10914 
0,197599.591396,2730510.17345 
0,203187.5176,2736670.5686 
0,207301.877268,2730639.81898 
0,200929.610894,2726377.9799 
0,204604.214301,2737608.342 
0,203780.386032,2734372.2709 
0,203077.172106,2731166.44271 
0,202477.371994,2728622.46292 
0,202249.861606,2734889.33996 
0,201794.840831,2732159.21531 

查閱下面的代碼生成用於BBOX每一行shapefile的記錄並檢查csv文件的哪個點在該bbox的內部打印狀態!

import fiona 
from shapely import geometry 
import csv 
csv_file = open(r"C:\data_test.csv",'rb') 
reader = csv.reader(csv_file) 
pnts = [] 
for i in reader: 
    pnts.append ((i[1],i[2])) 
bboxes = [] 
fiona_collection = fiona.open(r"C:\Rd.shp") 
for i in fiona_collection: 
    bboxes.append(geometry.asShape(i['geometry']).bounds) 


for i in pnts: 
    for j in bboxes: 
     shape = geometry.box(*map(float,j)) 
     pnt = geometry.Point(*map(float,i)) 
     if shape.contains(pnt): 
      print "bbox {0} contains {1} ".format(j,i) 

它prints-

bbox (197306.68136754428, 2729718.6493367185, 197823.7504301681, 2732035.118737273) contains ('197599.591396', '2730510.17345') 
bbox (202799.29018572776, 2728807.5534000006, 204604.21430105247, 2737608.342) contains ('203187.5176', '2736670.5686') 
bbox (202799.29018572776, 2728807.5534000006, 204604.21430105247, 2737608.342) contains ('203780.386032', '2734372.2709') 
bbox (202799.29018572776, 2728807.5534000006, 204604.21430105247, 2737608.342) contains ('203077.172106', '2731166.44271') 
bbox (2.0747999996, 2727558.2885, 203336.7932000002, 2728807.5534000006) contains ('202477.371994', '2728622.46292') 

你可以在here下載測試數據。