-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathserializers.py
More file actions
135 lines (122 loc) · 4.68 KB
/
serializers.py
File metadata and controls
135 lines (122 loc) · 4.68 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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
try:
import ogr
import osr
except:
from osgeo import ogr, osr
import requests
from .exceptions import EsriFeatureLayerException
from .utils import SLUGIFIER
class EsriSerializer(object):
field_types_mapping = {
"esriFieldTypeInteger": ogr.OFTInteger64,
"esriFieldTypeSmallInteger": ogr.OFSTInt16,
"esriFieldTypeDouble": ogr.OFTReal,
"esriFieldTypeSingle": ogr.OFSTFloat32,
"esriFieldTypeString": ogr.OFTString,
"esriFieldTypeDate": ogr.OFTString,
"esriFieldTypeBlob": ogr.OFTBinary,
"esriFieldTypeXML": ogr.OFTBinary,
# "esriFieldTypeGUID": "XXXX",
}
ignored_fields = [
"SHAPE_Length", "SHAPE_Area", "SHAPE.LEN", "Shape.STLength()",
"Shape.STArea()"
]
geometry_types_mapping = {
"esriGeometryPolygon": ogr.wkbPolygon,
"esriGeometryPoint": ogr.wkbPoint,
"esriGeometryMultipoint": ogr.wkbMultiPoint,
"esriGeometryPolyline": ogr.wkbLineString,
"esriGeometryLine": ogr.wkbLineString,
"esriGeometryCircularArc": ogr.wkbCurve,
"esriGeometryEllipticArc": ogr.wkbCircularString,
"esriGeometryEnvelope": ogr.wkbPolygon,
"esriGeometryRing": ogr.wkbPolygon,
"esriGeometryPath": ogr.wkbLineString,
}
ogr_geometry_types_mapping = {
"Polygon": ogr.wkbPolygon,
"MultiPolygon": ogr.wkbMultiPolygon,
"Point": ogr.wkbPoint,
"Multipoint": ogr.wkbMultiPoint,
"LineString": ogr.wkbLineString,
"MultiLineString": ogr.wkbMultiLineString,
}
def __init__(self, url):
self._url = url
self._data = None
self.get_data()
def get_data(self):
req = requests.get(self._url + "?f=json")
self._data = req.json()
if not self.is_feature_layer:
raise EsriFeatureLayerException(
"This URL {} Is Not A Feature Layer".format(self._url))
def get_fields_list(self):
data_fields = self._data['fields']
assert data_fields
layer_fields = []
def search_by_name(name):
check = False
for field in layer_fields:
if SLUGIFIER(field["name"]).encode('utf-8') == SLUGIFIER(
name).encode('utf-8'):
check = True
break
return check
for field in data_fields:
if field["type"] in self.field_types_mapping.keys(
) and field["name"] not in self.ignored_fields and not search_by_name(
field["name"]):
layer_fields.append(field)
return layer_fields
def build_fields(self):
data_fields = self.get_fields_list()
field_defns = []
for field in data_fields:
field_type = field["type"]
if str(SLUGIFIER(field["name"])).encode('utf-8'):
field_defn = ogr.FieldDefn(
str(SLUGIFIER(field["name"])),
self.field_types_mapping[field_type])
if field_type == "esriFieldTypeString" and field.get(
"length", None):
# NOTE: handle large text by WideString
# For Now set max length by default
# field_defn.SetWidth(field["length"])
field_defn.SetWidth(10485760)
if field_type in "esriFieldTypeInteger":
field_defn.SetPrecision(64)
if field_type != "esriFieldTypeDouble":
field_defn.SetNullable(1)
field_defns.append(field_defn)
return field_defns
def get_geometry_type(self):
geom_type = self.geometry_types_mapping.get(
self._data.get("geometryType", None), None)
if not geom_type:
raise EsriFeatureLayerException("No Geometry Type")
return geom_type
@property
def is_feature_layer(self):
return self._data['type'] == "Feature Layer"
def attributes_convertor(self, attributes):
raise NotImplementedError("To Be Implemented")
def get_name(self):
return SLUGIFIER(self._data["name"].lower())
def get_projection(self):
projection_number = None
try:
srs = self._data["extent"]["spatialReference"]
if "latestWkid" in srs:
projection_number = srs["latestWkid"]
elif srs["wkid"] == 102100:
projection_number = 3857
projection_number = srs["wkid"]
except:
projection_number = 4326
testSR = osr.SpatialReference()
res = testSR.ImportFromEPSG(projection_number)
if res != 0:
testSR.ImportFromEPSG(4326)
return testSR