Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # -*- coding: utf-8 -*-
- import sys, os
- sys.path.append(r'C:\Program Files (x86)\QGIS Lyon\apps\Python27\Lib\site-packages')
- os.environ['PATH'] = r'C:\Program Files (x86)\QGIS Lyon\bin'
- import csv
- from osgeo import ogr, gdal, osr
- shp = "RRN_QC_8_0_SEGMROUT_MTL"
- mycsv = 'Qc_short_Aires_diffusion_2006_MTL.csv'
- targetproj = 2950
- bufferSize = 500
- eventLat = 45.5009527
- eventLong = -73.5715501
- class SHPReader:
- def __init__(self, file, proj):
- self.driver = ogr.GetDriverByName('ESRI Shapefile')
- self.datasource = self.driver.Open(file)
- self.layer = self.datasource.GetLayer()
- self.origRef = self.layer.GetSpatialRef()
- self.projTarget = osr.SpatialReference()
- self.projTarget.ImportFromEPSG(proj)
- self.transform = osr.CoordinateTransformation(self.origRef, self.projTarget)
- class CSVReader:
- def __init__(self, csvfile):
- self.listobj = []
- with open(csvfile, 'rb') as f:
- self.reader = csv.reader(f, delimiter=",")
- self.rownum = 0
- for row in self.reader:
- if self.rownum == 0:
- self.header = row
- else:
- self.listobj.append(row)
- self.rownum += 1
- class ville:
- def __init__(self, name):
- self.name = name
- self.listStreets = []
- self.listAD = []
- def add_AD(self, file):
- tempRow = None
- for row in file:
- if not tempRow:
- tempRow = row #Cette loop et les suivantes, à ce niveau, additionne les données des ilots
- # de diffusion dans les aires de diffusion
- elif tempRow[6] != row[6]:
- self.listAD.append(Stats(tempRow, targetproj))
- tempRow = row
- elif tempRow and row[6] == tempRow[6]:
- if tempRow[1] == '':
- tempRow[1] = 0 #Les valeurs étaient en texte, on les rend en integer. De plus, on
- # transforme les NoData en valeur 0, sinon erreur
- else:
- tempRow[1] = int(tempRow[1])
- if tempRow[2] == '':
- tempRow[2] = 0
- else:
- tempRow[2] = int(tempRow[2])
- if tempRow[3] == '':
- tempRow[3] = 0
- else:
- tempRow[3] = int(tempRow[3])
- if row[1] == '':
- row[1] = 0
- if row[2] == '':
- row[2] = 0
- if row[3] == '':
- row[3] = 0
- tempRow[1] += int(row[1])
- tempRow[2] += int(row[2])
- tempRow[3] += int(row[3])
- def add_streets(self, layer, proj):
- for feature in layer:
- feature.GetGeometryRef().Transform(proj)
- self.listStreets.append(Street(feature))
- class Street:
- def __init__(self, rue):
- self.id = rue.GetField("IDN")
- self.nomrueGauche = rue.GetField("NOMRUE_C_G")
- self.nomrueDroit = rue.GetField("NOMRUE_C_D")
- self.numP_G = int(rue.GetField("NUMP_G"))
- self.numD_G = int(rue.GetField("NUMD_G"))
- self.numP_D = int(rue.GetField("NUMP_D"))
- self.numD_D = int(rue.GetField("NUMD_D"))
- self.geom = rue.GetGeometryRef().ExportToWkt()
- self.geom2 = ogr.CreateGeometryFromWkt(self.geom)
- self.geom3 = rue.GetGeometryRef().ExportToWkb()
- self.geom4 = ogr.CreateGeometryFromWkb(self.geom3)
- self.geom5 = rue.GetGeometryRef().Clone()
- class Stats:
- def __init__(self, ad, proj):
- self.IDudu = ad[0]
- self.ADidu = ad[6]
- self.ADlat = float(ad[9])
- self.ADlong = float(ad[10])
- self.pop2006 = ad[1]
- self.log2006 = ad[2]
- self.rh2006 = ad[3]
- self.source = osr.SpatialReference()
- self.source.ImportFromEPSG(4326)
- self.target = osr.SpatialReference()
- self.target.ImportFromEPSG(proj)
- self.transform = osr.CoordinateTransformation(self.source, self.target)
- self.coord = ogr.Geometry(ogr.wkbPoint)
- self.coord.AddPoint(self.ADlong, self.ADlat)
- self.coord.Transform(self.transform)
- class GeoCoder:
- def __init__(self, lat, long, buffer, proj):
- self.source = osr.SpatialReference()
- self.source.ImportFromEPSG(4326)
- self.target = osr.SpatialReference()
- self.target.ImportFromEPSG(proj)
- self.transform = osr.CoordinateTransformation(self.source, self.target)
- self.coord = ogr.Geometry(ogr.wkbPoint)
- self.coord.AddPoint(long, lat)
- self.coord.Transform(self.transform)
- self.area = self.coord.Buffer(buffer)
- class Analyser:
- def __init__(self, buffergeom, loc):
- self.affectedAD = []
- self.affectedStreets = []
- self.dist = 99999999
- self.closestStreet = None
- #for a in montreal.listAD:
- #if a.coord.Within(buffergeom):
- #self.affectedAD.append(a)
- for a in montreal.listStreets:
- if buffergeom.Overlaps(a.geom5):
- self.affectedStreets.append(a)
- #for a in self.affectedStreets:
- #if a.geom.Distance(loc) < self.dist:
- #self.dist = a.geom.Distance(loc)
- #self.closestStreet = a
- mystreets = SHPReader(shp, targetproj)
- mystats = CSVReader(mycsv)
- montreal = ville("Montreal")
- montreal.add_AD(mystats.listobj)
- montreal.add_streets(mystreets.layer, mystreets.transform)
- test1 = GeoCoder(eventLat,eventLong,bufferSize,targetproj)
- testanalyse = Analyser(test1.area,test1.coord)
- print testanalyse.affectedStreets
- #print test1.coord
- print [a.geom for a in montreal.listStreets[:2]]
- print [a.geom2 for a in montreal.listStreets[:2]]
- print [a.geom3 for a in montreal.listStreets[:2]]
- print [a.geom4 for a in montreal.listStreets[:2]]
- print [a.geom5 for a in montreal.listStreets[:2]]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement