[postgis-users] Beginning in PostGIS
Rémi Cura
remi.cura at gmail.com
Sat Apr 18 12:19:28 PDT 2015
Ok, this is totally a postgres question then.
First you create your data model (here it is just for example, you should
pick better name, don't use capital, no space, etc)
CREATE TABLE Cities (...)
CREATE TABLE Neighborhoods ()
CREATE TABLE Blocks()
CREATE TABLE Streets ()
>From here I expect a correct data model, with primary key, foreign key,
constraints, etc.
You create a postgres table importing_data :
CREATE TABLE importing_data (
iid serial PRIMARY KEY
,town_code int
,town_description
text
,Neighborhood_code int
,name_of_the_neighborhood text
,block_code int
,Street_code int
,street_name text) ;
Now you define a trigger
<http://www.postgresql.org/docs/9.3/static/sql-createtrigger.html> on this
table
CREATE TRIGGER name AFTER INSERT
ON importing_data
FOR EACH ROW
EXECUTE PROCEDURE filling_data_model()
This trigger says that every time you insert a line in 'importing_data',
the function 'filling_data_model()' gets called.
Now you define this function so that it does what you want (filling you
data model)
CREATE OR REPLACE FUNCTION
filling_data_model( )
RETURNS trigger AS
$BODY$
--
this trigger break an inserted line in table
importing_data
--
and put hte informations in the tables
--
Cities,Neighborhoods,Blocks,Streets
DECLARE
BEGIN
--the inserted line
in 'importing_data'
is in the variable 'NEW'
--insert into city
INSERT INTO Cities VALUES (NEW[1], NEW[2]) ;
--insert into Neighborhoods
INSERT INTO ...
....
return NEW;
END ;
$BODY$ LANGUAGE plpgsql VOLATILE;
Based on the information you gave, you probably don't want to do an
insert, but rather an upsert (see here for instance:
http://stackoverflow.com/a/8702291/330315)
Now it is super easy, simply import your shapefile into the
'importing_data' table, and it should be good
cheers
Rémi-C
2015-04-18 20:42 GMT+02:00 Luciano <br.analistagis at gmail.com>:
> Ok Remi, and Jim, thanks...
>
> Lee,
>
> Thats it,
>
> the problem is that I get/receive a shape file with the following
> structure and need to use it to update my database.
>
> But my database does not have the same file's structure.
>
> As mentioned above...
>
> tia
>
> 2015-04-18 15:14 GMT-03:00 Lee Hachadoorian <Lee.Hachadoorian+L at gmail.com>
> :
>
> Luciano,
>>
>> I think I'm not understanding your goal. Do you have a shapefile that
>> contains a mix of towns, neighborhoods, blocks and streets? Are you trying
>> to load the shapefile but break the features up so that towns get inserted
>> in a PostGIS towns table, neighborhoods get inserted in a PostGIS
>> neighborhoods table, etc.?
>>
>> Best,
>> --Lee
>>
>>
>> On 04/18/2015 12:22 PM, James Keener wrote:
>>
>> I guess I'm still not fully understanding the problem. I don't understand
>> what problem the normalization is causing you. You shouldn't need to
>> duplicate the rows in different tables when you duplicate one in another
>> table.
>>
>> To edit fields in QGIS you need to enable editing on the layer and then
>> you can get end editable form for each feature or you can edit directly in
>> the attribute table. Copy and pasting features in QGIS copied all of the
>> attributes as well.
>>
>> Can you give a more complete example of the issue you're facing?
>>
>> Jim
>>
>> Jim
>>
>> On April 18, 2015 12:11:38 PM EDT, Luciano <br.analistagis at gmail.com>
>> <br.analistagis at gmail.com> wrote:
>>>
>>> Yes, I'm using QGIS. I agree, if I make a table in the database with
>>> the same structure the shape file is simple. The copy / paste works
>>> perfectly.
>>> But my question is how to update for example the blocks table, using the copy
>>> / paste, since the database structure is different.
>>> For example, if I copy a polygon layer shape, and try to stick to the
>>> database layer, the fields of the new polygon will be void.
>>> Note that my database blocks table does not have the same structure of
>>> the shape file because it is normalized (or should be), so the fields of two
>>> data sources do not match.
>>> In this case, what is the best practice?
>>>
>>> tia
>>>
>>> 2015-04-18 12:44 GMT-03:00 James Keener <jim at jimkeener.com>:
>>>
>>>> tl;dr: Have you tried QGIS?
>>>>
>>>> What were you using to copy/paste before? I didn't think straight
>>>> editing of the DBaseIII files directly was a sane thing to do, as
>>>> they're linked up with the shape and shape-index files.
>>>>
>>>> PostGIS is just a PostgreSQL database, so any editor that can allow you
>>>> to edit/duplicate PostgreSQL tables could work. As for mutating
>>>> geometries, maybe QGIS? That would also allow you to edit geometries,
>>>> attributes, as well as duplicate features.
>>>>
>>>> Hope that helps,
>>>> Jim
>>>>
>>>> On 04/18/2015 11:39 AM, Luciano wrote:
>>>> >
>>>> > Hi,
>>>> > I wonder how can I update a postgresql postgis database before the
>>>> > following scenario:
>>>> > Always worked with shape files and update them used copy / paste
>>>> between
>>>> > files.
>>>> > Now, think about creating a database in PostgreSQL and would like to
>>>> > continue using copy / paste to update polygons, but in my database
>>>> > structure is different from the shape file. For example:
>>>> > Imagine that the shapefile have all the fields in one table, already
>>>> in
>>>> > the database, by reason of standardization, have these columns in
>>>> tables
>>>> > distinct. Below is an example of a register of towns.
>>>> >
>>>> > File shape, columns:
>>>> > town code;
>>>> > town description;
>>>> > Neighborhood code;
>>>> > name of the neighborhood;
>>>> > block code;
>>>> > Street code;
>>>> > street name;
>>>> >
>>>> > In Postgres / Gis could look like this:
>>>> >
>>>> > Cities table (data):
>>>> > - Town id
>>>> > - Description of town
>>>> >
>>>> > Neighborhoods table (data):
>>>> > - Id of the neighborhood
>>>> > - Description of the neighborhood
>>>> > - Id of town (foreign key)
>>>> >
>>>> > Blocks table:
>>>> > - Id of the court
>>>> > - Block of code
>>>> > - Town id (foreign key)
>>>> > - Geometry, polygon
>>>> >
>>>> > Streets table:
>>>> > - Street id
>>>> > - Street name
>>>> > - Town id (foreign key)
>>>> > - Geometry, line
>>>> >
>>>> > How could update (insert) a block in postgresql table using copy /
>>>> paste
>>>> > the shape file?
>>>> > Would have to create a trigger/procedure (instead of) to automate the
>>>> > process?
>>>> > Fields of shape file should be equal to the fields of database table?
>>>> > Some practical example as a reference?
>>>> >
>>>> > tia
>>>> > --
>>>> > Luciano
>>>> >
>>>> >
>>>> >
>>>> > _______________________________________________
>>>> > postgis-users mailing list
>>>> > postgis-users at lists.osgeo.org
>>>> > http://lists.osgeo.org/cgi-bin/mailman/listinfo/postgis-users
>>>> >
>>>>
>>>>
>>>> _______________________________________________
>>>> postgis-users mailing list
>>>> postgis-users at lists.osgeo.org
>>>> http://lists.osgeo.org/cgi-bin/mailman/listinfo/postgis-users
>>>>
>>>
>>>
>>>
>> --
>> Sent from my Android device with K-9 Mail. Please excuse my brevity.
>>
>> _______________________________________________
>> postgis-users mailing listpostgis-users at lists.osgeo.orghttp://lists.osgeo.org/cgi-bin/mailman/listinfo/postgis-users
>>
>>
>> --
>> Lee Hachadoorian
>> Assistant Professor in Geography, Dartmouth Collegehttp://geospatial.commons.gc.cuny.eduhttp://freecity.commons.gc.cuny.edu
>>
>>
>
>
> --
> Luciano
>
>
> _______________________________________________
> postgis-users mailing list
> postgis-users at lists.osgeo.org
> http://lists.osgeo.org/cgi-bin/mailman/listinfo/postgis-users
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/postgis-users/attachments/20150418/042c8552/attachment.html>
More information about the postgis-users
mailing list