-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcsv2vector_model.py
More file actions
118 lines (85 loc) · 3.67 KB
/
Copy pathcsv2vector_model.py
File metadata and controls
118 lines (85 loc) · 3.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
# -*- coding: utf-8 -*-
import csv, os, copy
def recalculateCoordinates( (long,lat), (azGrad, dist) ):
from math import cos, sin, acos, pi, asin, atan2
#rad - радиус сферы (Земли)
rad = 6372795.0
azRadians = pi * azGrad / 180
ilat = (180/pi) * asin( sin(lat*pi/180)*cos(dist/rad) + cos(lat*pi/180)*sin(dist/rad)*cos(azRadians) )
ilong = long + asin(sin(azRadians) * sin(dist/rad) / cos(ilat*pi/180)) * 180/pi
return (ilong, ilat)
class Csv2vectorModel(object):
def __init__(self, ):
self.__csvFilePath = None
self.__csvDelimiter = "\t"
self.__shpFilePath = None
self.__shpFileEncoding = None
self.__csvHeader = []
self.__csvDataLineNum = 0
self.__csvDataIterator = None
self.__csvfile = None
self.__csvfilereader = None
def __del__(self):
self.__csvfile.close()
@property
def csvFilePath(self):
return self.__csvFilePath
@csvFilePath.setter
def csvFilePath(self, filePath):
self.__csvFilePath = filePath
self.__csvFileProcessing()
self.modelChange()
@property
def csvDelimiter(self):
return self.__csvDelimiter
@csvDelimiter.setter
def csvDelimiter(self, delimiter):
self.__csvDelimiter = delimiter
self.__csvFileProcessing()
self.modelChange()
@property
def shpFileInfo(self):
return (self.__shpFilePath, self.__shpFileEncoding)
@shpFileInfo.setter
def shpFileInfo(self, (filePath, Encoding)):
(self.__shpFilePath, self.__shpFileEncoding) = (filePath, Encoding)
#self.modelChange()
@property
def csvDataLineNum(self):
return self.__csvDataLineNum
@property
def csvHeader(self):
return self.__csvHeader
@property
def csvDataIterator(self):
return self.__csvDataIterator
def __csvFileProcessing(self):
if (self.__csvfile != None):
self.__csvfile.close()
self.__csvfile = open( os.path.abspath(self.__csvFilePath) )
self.__csvfilereader = csv.reader( self.__csvfile, delimiter=self.__csvDelimiter )
self.__csvHeader = self.__csvfilereader.next()
self.__csvDataLineNum = self.__csvfilereader.line_num
print self.__csvDataLineNum
self.__csvDataIterator = self.__createCSVDataIterator(self.__csvfilereader)
def __createCSVDataIterator(self, csvfilereader):
for data in csvfilereader:
yield data
def getGeoDataAttributes(self, xAttrIndex, yAttrIndex, azAttrIndex, distAttrIndex):
#attributesIndexes = list(set(range(self.__csvHeader.__len__())) ^ set([xAttrIndex, yAttrIndex, azAttrIndex, distAttrIndex]))
attributesIndexes = list(set(range(self.__csvHeader.__len__())) ^ set([]))
return dict(zip(attributesIndexes, [ self.__csvHeader[attrIndex] for attrIndex in attributesIndexes]))
def getGeoDataIterator(self, xAttrIndex, yAttrIndex, azAttrIndex, distAttrIndex):
self.__csvFileProcessing()
for data in self.__csvfilereader:
attributesIndexes = self.getGeoDataAttributes(xAttrIndex, yAttrIndex, azAttrIndex, distAttrIndex).keys()
attributes = [data[attrIndex] for attrIndex in attributesIndexes]
yield ((data[xAttrIndex],data[yAttrIndex]), (data[azAttrIndex],data[distAttrIndex]), attributes)
def subscribToModelChange(self, func):
self.__observFunc = func
def modelChange(self):
self.__observFunc()
if __name__ == '__main__':
(long,lat) = (53.89045716729015, 27.555393604561687)
print recalculateCoordinates( (long,lat), (0, 100) )
print recalculateCoordinates( (long,lat), (90, 100) )