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
|
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
sys.path.append('.')
from django.core.management import setup_environ
import settings
setup_environ(settings)
from django.db import connection, transaction
cursor = connection.cursor()
from main.models import Area, Route
# early versions before 0.1: urn field doesn't exist for area
import htmlentitydefs, re
def slugfy(text, separator):
ret = u""
text = text.strip()
for c in text.lower():
try:
ret += htmlentitydefs.codepoint2name[ord(c)][0]
except:
ret += c
ret = re.sub("\W", " ", ret)
ret = re.sub(" +", separator, ret)
return ret.strip()
query = """SELECT a.attname AS field FROM pg_class c, pg_attribute a
WHERE c.relname = 'main_area' AND a.attnum > 0 AND a.attrelid = c.oid
AND a.attname='urn';"""
cursor.execute(query)
transaction.commit_unless_managed()
row = cursor.fetchone()
if not row:
query_update = "ALTER TABLE main_area ADD COLUMN urn VARCHAR(50) \
UNIQUE"
cursor.execute(query_update)
transaction.commit_unless_managed()
areas = Area.objects.all()
print " * urn field created in table main_area"
for area in areas:
urn = slugfy(area.name, "-")
area.urn = urn
area.save()
print " * area %s urn is now: %s" % (area.name, area.urn)
query = "ALTER TABLE main_area ALTER COLUMN urn SET not null;"
cursor.execute(query)
transaction.commit_unless_managed()
print " * urn field has now the constraint NOT NULL"
# early versions before 0.1: save area with wrong SRID
# only errors with default SRID is managed adapt the script for your SRID
from osgeo import osr
areas = Area.objects.all()
srs = osr.SpatialReference()
srs.ImportFromEPSG(4326) # WGS84
ll = srs.CloneGeogCS()
srs.ImportFromEPSG(settings.EPSG_PROJECTION)
proj = osr.CoordinateTransformation(srs, ll)
changed = False
for area in areas:
# only one test: assume each point as been save with the same SRID...
if area.upper_left_corner.srid == 4326 and area.upper_left_corner.x > 90 \
or area.upper_left_corner < -90:
changed = True
pt = proj.TransformPoint(area.upper_left_corner.y,
area.upper_left_corner.x)
area.upper_left_corner.x = pt[0]
area.upper_left_corner.y = pt[1]
pt = proj.TransformPoint(area.lower_right_corner.y,
area.lower_right_corner.x)
area.lower_right_corner.x = pt[0]
area.lower_right_corner.y = pt[1]
area.save()
if changed:
print " * projections of areas corrected"
|