229 |
|
|
230 |
def get_default_static_data_db(self): |
def get_default_static_data_db(self): |
231 |
dbname = "PostGISStaticTests" |
dbname = "PostGISStaticTests" |
232 |
tables = [("landmarks", os.path.join("..", "Data", "iceland", |
tables = [ |
233 |
"cultural_landmark-point.shp")), |
# Direct copies of the shapefiles. The shapeids are exactly |
234 |
("political", os.path.join("..", "Data", "iceland", |
# the same. |
235 |
|
("landmarks", os.path.join("..", "Data", "iceland", |
236 |
|
"cultural_landmark-point.shp"), |
237 |
|
[("gid_offset", 1000)]), |
238 |
|
("political", os.path.join("..", "Data", "iceland", |
239 |
"political.shp")), |
"political.shp")), |
240 |
|
("roads", os.path.join("..", "Data", "iceland", |
241 |
|
"roads-line.shp")), |
242 |
|
|
243 |
# The polygon data as a MULTIPOLYGON geometry type |
# The polygon data as a MULTIPOLYGON geometry type |
244 |
("political_multi", os.path.join("..", "Data", "iceland", |
("political_multi", os.path.join("..", "Data", "iceland", |
245 |
"political.shp"), |
"political.shp"), |
246 |
"MULTIPOLYGON"), |
[("force_wkt_type", "MULTIPOLYGON")]), |
247 |
|
] |
|
("roads", os.path.join("..", "Data", "iceland", |
|
|
"roads-line.shp"))] |
|
248 |
return self.get_static_data_db(dbname, tables) |
return self.get_static_data_db(dbname, tables) |
249 |
|
|
250 |
def connection_params(self, user): |
def connection_params(self, user): |
324 |
"""A PostGIS database in a PostgreSQLServer""" |
"""A PostGIS database in a PostgreSQLServer""" |
325 |
|
|
326 |
def __init__(self, server, postgis_sql, dbname, tables = None): |
def __init__(self, server, postgis_sql, dbname, tables = None): |
327 |
|
"""Initialize the PostGISDatabase |
328 |
|
|
329 |
|
Parameters: |
330 |
|
|
331 |
|
server -- The PostgreSQLServer instance containing the |
332 |
|
database |
333 |
|
|
334 |
|
postgis_sql -- Filename of the postgis.sql file with the |
335 |
|
postgis initialization code |
336 |
|
|
337 |
|
dbname -- The name of the database |
338 |
|
|
339 |
|
tables -- Optional description of tables to create in the |
340 |
|
new database. If given it should be a list of |
341 |
|
(tablename, shapefilename) pairs meaning that a table |
342 |
|
tablename will be created with the contents of the given |
343 |
|
shapefile or (tablename, shapefilename, extraargs) |
344 |
|
triples. The extraargs should be a list of key, value |
345 |
|
pairs to use as keyword arguments to upload_shapefile. |
346 |
|
""" |
347 |
self.server = server |
self.server = server |
348 |
self.postgis_sql = postgis_sql |
self.postgis_sql = postgis_sql |
349 |
self.dbname = dbname |
self.dbname = dbname |
375 |
"GRANT SELECT ON geometry_columns TO PUBLIC;") |
"GRANT SELECT ON geometry_columns TO PUBLIC;") |
376 |
|
|
377 |
if self.tables is not None: |
if self.tables is not None: |
378 |
for info in self.tables: |
def unpack(item): |
379 |
|
extra = {"force_wkt_type": None, "gid_offset": 0} |
380 |
if len(info) == 2: |
if len(info) == 2: |
381 |
tablename, shapefile = info |
tablename, shapefile = info |
|
wkt_type = None |
|
382 |
else: |
else: |
383 |
tablename, shapefile, wkt_type = info |
tablename, shapefile, kw = info |
384 |
upload_shapefile(shapefile, self, tablename, |
for key, val in kw: |
385 |
force_wkt_type = wkt_type) |
extra[key] = val |
386 |
|
return tablename, shapefile, extra |
387 |
|
|
388 |
|
for info in self.tables: |
389 |
|
tablename, shapefile, kw = unpack(info) |
390 |
|
upload_shapefile(shapefile, self, tablename, **kw) |
391 |
|
|
392 |
def has_data(self, tables): |
def has_data(self, tables): |
393 |
return self.tables == tables |
return self.tables == tables |
514 |
"MULTIPOLYGON": coords_to_multipolygon, |
"MULTIPOLYGON": coords_to_multipolygon, |
515 |
} |
} |
516 |
|
|
517 |
def upload_shapefile(filename, db, tablename, force_wkt_type = None): |
def upload_shapefile(filename, db, tablename, force_wkt_type = None, |
518 |
|
gid_offset = 0): |
519 |
|
"""Upload a shapefile into a new database table |
520 |
|
|
521 |
|
Parameters: |
522 |
|
|
523 |
|
filename -- The name of the shapefile |
524 |
|
|
525 |
|
db -- The PostGISDatabase instance representing the database |
526 |
|
|
527 |
|
tablename -- The name of the table to create and into which the data |
528 |
|
is to be inserted |
529 |
|
|
530 |
|
force_wkt_type -- If given the real WKT geometry type to use instead |
531 |
|
of the default that would be chosen based on the type of |
532 |
|
the shapefile |
533 |
|
|
534 |
|
gid_offset -- A number to add to the shapeid to get the value for |
535 |
|
the gid column (default 0) |
536 |
|
""" |
537 |
import dbflib, shapelib |
import dbflib, shapelib |
538 |
|
|
539 |
# We build this map here because we need shapelib which can only be |
# We build this map here because we need shapelib which can only be |
586 |
for i in range(numshapes): |
for i in range(numshapes): |
587 |
data = dbf.read_record(i) |
data = dbf.read_record(i) |
588 |
data["tablename"] = tablename |
data["tablename"] = tablename |
589 |
data["gid"] = i |
data["gid"] = i + gid_offset |
590 |
data["the_geom"] = convert(shp.read_object(i).vertices()) |
data["the_geom"] = convert(shp.read_object(i).vertices()) |
591 |
#print insert % data |
#print insert % data |
592 |
cursor.execute(insert, data) |
cursor.execute(insert, data) |