Advertisement
Guest User

Untitled

a guest
Nov 27th, 2015
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.00 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. import sys, os
  3. sys.path.append(r'C:\Program Files (x86)\QGIS Lyon\apps\Python27\Lib\site-packages')
  4. os.environ['PATH'] = r'C:\Program Files (x86)\QGIS Lyon\bin'
  5. import csv
  6. from osgeo import ogr, gdal, osr
  7.  
  8. shp = "RRN_QC_8_0_SEGMROUT_MTL"
  9. mycsv = 'Qc_short_Aires_diffusion_2006_MTL.csv'
  10. targetproj = 2950
  11. bufferSize = 500
  12. eventLat = 45.5009527
  13. eventLong = -73.5715501
  14.  
  15. class SHPReader:
  16.     def __init__(self, file, proj):
  17.         self.driver = ogr.GetDriverByName('ESRI Shapefile')
  18.         self.datasource = self.driver.Open(file)
  19.         self.layer = self.datasource.GetLayer()
  20.         self.origRef = self.layer.GetSpatialRef()
  21.         self.projTarget = osr.SpatialReference()
  22.         self.projTarget.ImportFromEPSG(proj)
  23.         self.transform = osr.CoordinateTransformation(self.origRef, self.projTarget)
  24.  
  25. class CSVReader:
  26.     def __init__(self, csvfile):
  27.         self.listobj = []
  28.         with open(csvfile, 'rb') as f:
  29.             self.reader = csv.reader(f, delimiter=",")
  30.             self.rownum = 0
  31.             for row in self.reader:
  32.                 if self.rownum == 0:
  33.                     self.header = row
  34.                 else:
  35.                     self.listobj.append(row)
  36.                 self.rownum += 1
  37.  
  38. class ville:
  39.     def __init__(self, name):
  40.         self.name = name
  41.         self.listStreets = []
  42.         self.listAD = []
  43.  
  44.     def add_AD(self, file):
  45.         tempRow = None
  46.         for row in file:
  47.             if not tempRow:
  48.                 tempRow = row #Cette loop et les suivantes, à ce niveau, additionne les données des ilots
  49.                                         # de diffusion dans les aires de diffusion
  50.             elif tempRow[6] != row[6]:
  51.                 self.listAD.append(Stats(tempRow, targetproj))
  52.                 tempRow = row
  53.             elif tempRow and row[6] == tempRow[6]:
  54.                 if tempRow[1] == '':
  55.                     tempRow[1] = 0 #Les valeurs étaient en texte, on les rend en integer. De plus, on
  56.                                             # transforme les NoData en valeur 0, sinon erreur
  57.                 else:
  58.                     tempRow[1] = int(tempRow[1])
  59.                 if tempRow[2] == '':
  60.                     tempRow[2] = 0
  61.                 else:
  62.                     tempRow[2] = int(tempRow[2])
  63.                 if tempRow[3] == '':
  64.                     tempRow[3] = 0
  65.                 else:
  66.                     tempRow[3] = int(tempRow[3])
  67.  
  68.                 if row[1] == '':
  69.                     row[1] = 0
  70.  
  71.                 if row[2] == '':
  72.                     row[2] = 0
  73.  
  74.                 if row[3] == '':
  75.                     row[3] = 0
  76.                 tempRow[1] += int(row[1])
  77.                 tempRow[2] += int(row[2])
  78.                 tempRow[3] += int(row[3])
  79.  
  80.     def add_streets(self, layer, proj):
  81.         for feature in layer:
  82.             feature.GetGeometryRef().Transform(proj)
  83.             self.listStreets.append(Street(feature))
  84.  
  85. class Street:
  86.     def __init__(self, rue):
  87.         self.id = rue.GetField("IDN")
  88.         self.nomrueGauche = rue.GetField("NOMRUE_C_G")
  89.         self.nomrueDroit = rue.GetField("NOMRUE_C_D")
  90.         self.numP_G = int(rue.GetField("NUMP_G"))
  91.         self.numD_G = int(rue.GetField("NUMD_G"))
  92.         self.numP_D = int(rue.GetField("NUMP_D"))
  93.         self.numD_D = int(rue.GetField("NUMD_D"))
  94.         self.geom = rue.GetGeometryRef().ExportToWkt()
  95.         self.geom2 = ogr.CreateGeometryFromWkt(self.geom)
  96.         self.geom3 = rue.GetGeometryRef().ExportToWkb()
  97.         self.geom4 = ogr.CreateGeometryFromWkb(self.geom3)
  98.         self.geom5 = rue.GetGeometryRef().Clone()
  99.  
  100. class Stats:
  101.     def __init__(self, ad, proj):
  102.         self.IDudu = ad[0]
  103.         self.ADidu = ad[6]
  104.         self.ADlat = float(ad[9])
  105.         self.ADlong = float(ad[10])
  106.         self.pop2006 = ad[1]
  107.         self.log2006 = ad[2]
  108.         self.rh2006 = ad[3]
  109.         self.source = osr.SpatialReference()
  110.         self.source.ImportFromEPSG(4326)
  111.         self.target = osr.SpatialReference()
  112.         self.target.ImportFromEPSG(proj)
  113.         self.transform = osr.CoordinateTransformation(self.source, self.target)
  114.         self.coord = ogr.Geometry(ogr.wkbPoint)
  115.         self.coord.AddPoint(self.ADlong, self.ADlat)
  116.         self.coord.Transform(self.transform)
  117.  
  118. class GeoCoder:
  119.     def __init__(self, lat, long, buffer, proj):
  120.         self.source = osr.SpatialReference()
  121.         self.source.ImportFromEPSG(4326)
  122.         self.target = osr.SpatialReference()
  123.         self.target.ImportFromEPSG(proj)
  124.         self.transform = osr.CoordinateTransformation(self.source, self.target)
  125.         self.coord = ogr.Geometry(ogr.wkbPoint)
  126.         self.coord.AddPoint(long, lat)
  127.         self.coord.Transform(self.transform)
  128.         self.area = self.coord.Buffer(buffer)
  129.  
  130. class Analyser:
  131.     def __init__(self, buffergeom, loc):
  132.         self.affectedAD = []
  133.         self.affectedStreets = []
  134.         self.dist = 99999999
  135.         self.closestStreet = None
  136.  
  137.         #for a in montreal.listAD:
  138.             #if a.coord.Within(buffergeom):
  139.                 #self.affectedAD.append(a)
  140.  
  141.         for a in montreal.listStreets:
  142.             if buffergeom.Overlaps(a.geom5):
  143.                 self.affectedStreets.append(a)
  144.  
  145.         #for a in self.affectedStreets:
  146.             #if a.geom.Distance(loc) < self.dist:
  147.                 #self.dist = a.geom.Distance(loc)
  148.                 #self.closestStreet = a
  149.  
  150.  
  151. mystreets = SHPReader(shp, targetproj)
  152. mystats = CSVReader(mycsv)
  153.  
  154. montreal = ville("Montreal")
  155. montreal.add_AD(mystats.listobj)
  156. montreal.add_streets(mystreets.layer, mystreets.transform)
  157.  
  158. test1 = GeoCoder(eventLat,eventLong,bufferSize,targetproj)
  159. testanalyse = Analyser(test1.area,test1.coord)
  160. print testanalyse.affectedStreets
  161. #print test1.coord
  162. print [a.geom for a in montreal.listStreets[:2]]
  163. print [a.geom2 for a in montreal.listStreets[:2]]
  164. print [a.geom3 for a in montreal.listStreets[:2]]
  165. print [a.geom4 for a in montreal.listStreets[:2]]
  166. print [a.geom5 for a in montreal.listStreets[:2]]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement