Concatenazione di stringhe in uno shapefile

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
10 messages Options
Reply | Threaded
Open this post in threaded view
|

Concatenazione di stringhe in uno shapefile

Alessandro Sarretta
Ciao a tutti,
ho un problema molto pratico.
Per svariati motivi ho 2 shapefile lineari uguali (stesse geometrie) con
uno stesso campo testuale (NOME) contenente, nel primo shapefile la
prima parte di un codice, nel secondo shapefile la seconda parte; le due
parti peròsono sovrapposte.
Cerco di esemplificare:
1° shp    2° shp
NOME    NOME
qwer    erty
asdf    dfgh
zxcv    cvbn

Io vorrei avere un campo NOME con
qwerty
asdfgh
zxcvbn
cioè tutti i caratteri del primo shp e il 3° e 4° del secondo.

Ho provato a usare la funzione di concatenazione || nel field calculator
di QGIS, ma non riesco a gestire la sovrapposizione dei caratteri.
Sapreste aiutarmi?

Generalizzo la domanda: con le API di QGIS o con qualche altra libreria
(ogr?, shapelib?) è possibile farlo con uno script senza entrare in QGIS?
Grazie per qualsiasi spunto!
Ale

--
Alessandro Sarretta

e-mail: [hidden email]
skype: alesarrett
Web: http://ilsarrett.wordpress.com
Twitter: https://twitter.com/alesarrett
Google scholar: http://scholar.google.it/citations?hl=it&user=IsyXargAAAAJ
ORCID: http://orcid.org/0000-0002-1475-8686
ResearchGate: https://www.researchgate.net/profile/Alessandro_Sarretta/

_______________________________________________
[hidden email]
http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss
Questa e' una lista di discussione pubblica aperta a tutti.
I messaggi di questa lista non hanno relazione diretta con le posizioni dell'Associazione GFOSS.it.
638 iscritti al 28.2.2013
Reply | Threaded
Open this post in threaded view
|

Re: Concatenazione di stringhe in uno shapefile

Paolo Corti
2013/5/21 Alessandro Sarretta <[hidden email]>:

> Ciao a tutti,
> ho un problema molto pratico.
> Per svariati motivi ho 2 shapefile lineari uguali (stesse geometrie) con uno
> stesso campo testuale (NOME) contenente, nel primo shapefile la prima parte
> di un codice, nel secondo shapefile la seconda parte; le due parti peròsono
> sovrapposte.
> Cerco di esemplificare:
> 1° shp    2° shp
> NOME    NOME
> qwer    erty
> asdf    dfgh
> zxcv    cvbn
>
> Io vorrei avere un campo NOME con
> qwerty
> asdfgh
> zxcvbn
> cioè tutti i caratteri del primo shp e il 3° e 4° del secondo.
>
> Ho provato a usare la funzione di concatenazione || nel field calculator di
> QGIS, ma non riesco a gestire la sovrapposizione dei caratteri. Sapreste
> aiutarmi?
>

Ciao Ale

Con il QGIS field calculator puoi usare la concatenazione giocando con
la funzione substr dopo aver fatto uno spatial join dei due shapefile.

Nel tuo caso dovrebbe essere:
substr(field1, 0, 4)  ||  substr(field2, 2, length(mytest2))

ciao
p

--
Paolo Corti
Geospatial software developer
web: http://www.paolocorti.net
twitter: @capooti
skype: capooti
_______________________________________________
[hidden email]
http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss
Questa e' una lista di discussione pubblica aperta a tutti.
I messaggi di questa lista non hanno relazione diretta con le posizioni dell'Associazione GFOSS.it.
638 iscritti al 28.2.2013
Reply | Threaded
Open this post in threaded view
|

Re: Concatenazione di stringhe in uno shapefile

Alessandro Sarretta
Grazie Paolo,
la concatenzazione funzia a dovere!
Esiste una modalità (o una documentazione per approfondire) per farlo al
di fuori dell'interfaccia di QGIS?
Ale

On 05/21/2013 04:14 PM, Paolo Corti wrote:

> 2013/5/21 Alessandro Sarretta <[hidden email]>:
>> Ciao a tutti,
>> ho un problema molto pratico.
>> Per svariati motivi ho 2 shapefile lineari uguali (stesse geometrie) con uno
>> stesso campo testuale (NOME) contenente, nel primo shapefile la prima parte
>> di un codice, nel secondo shapefile la seconda parte; le due parti peròsono
>> sovrapposte.
>> Cerco di esemplificare:
>> 1° shp    2° shp
>> NOME    NOME
>> qwer    erty
>> asdf    dfgh
>> zxcv    cvbn
>>
>> Io vorrei avere un campo NOME con
>> qwerty
>> asdfgh
>> zxcvbn
>> cioè tutti i caratteri del primo shp e il 3° e 4° del secondo.
>>
>> Ho provato a usare la funzione di concatenazione || nel field calculator di
>> QGIS, ma non riesco a gestire la sovrapposizione dei caratteri. Sapreste
>> aiutarmi?
>>
> Ciao Ale
>
> Con il QGIS field calculator puoi usare la concatenazione giocando con
> la funzione substr dopo aver fatto uno spatial join dei due shapefile.
>
> Nel tuo caso dovrebbe essere:
> substr(field1, 0, 4)  ||  substr(field2, 2, length(mytest2))
>
> ciao
> p
>


--
Alessandro Sarretta

e-mail: [hidden email]
skype: alesarrett
Web: http://ilsarrett.wordpress.com
Twitter: https://twitter.com/alesarrett
Google scholar: http://scholar.google.it/citations?hl=it&user=IsyXargAAAAJ
ORCID: http://orcid.org/0000-0002-1475-8686
ResearchGate: https://www.researchgate.net/profile/Alessandro_Sarretta/

_______________________________________________
[hidden email]
http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss
Questa e' una lista di discussione pubblica aperta a tutti.
I messaggi di questa lista non hanno relazione diretta con le posizioni dell'Associazione GFOSS.it.
638 iscritti al 28.2.2013
Reply | Threaded
Open this post in threaded view
|

Re: Concatenazione di stringhe in uno shapefile

Paolo Corti
2013/5/21 Alessandro Sarretta <[hidden email]>:
> Grazie Paolo,
> la concatenzazione funzia a dovere!
> Esiste una modalità (o una documentazione per approfondire) per farlo al di
> fuori dell'interfaccia di QGIS?
> Ale
>

Puoi usare la sintassi GDAL OGR SQL [1], e mediante ogr2ogr fare una
cosa di questo tipo:

$ ogr2ogr output.shp input.shp -sql 'SELECT *, CONCAT(field1, field2)
AS output FROM input'

ciao
p

[1] http://www.gdal.org/ogr/ogr_sql.html

--
Paolo Corti
Geospatial software developer
web: http://www.paolocorti.net
twitter: @capooti
skype: capooti
_______________________________________________
[hidden email]
http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss
Questa e' una lista di discussione pubblica aperta a tutti.
I messaggi di questa lista non hanno relazione diretta con le posizioni dell'Associazione GFOSS.it.
638 iscritti al 28.2.2013
Reply | Threaded
Open this post in threaded view
|

Re: Concatenazione di stringhe in uno shapefile

Alessandro Sarretta
Grazie di nuovo Paolo.
Sto giocando ancora con ogr, questa volta per fare un join tra due shapefiles.
Con il seguente comando faccio il join tra input.shp e inputJoin.shp, sputando il risultato in output.shp

ogr2ogr -f "ESRI Shapefile" -overwrite output.shp input.shp -sql "SELECT input.*, CONCAT(substr(input.fieldX,1,2), substr(inputJoin.fieldY,1)) AS conc FROM input LEFT JOIN 'inputJoin.dbf'.inputJoin ON input.ID = inputJoin.ID"


Quello che non mi torna molto è che sembra che il join si debba fare (ho trovato alcuni esempi simili) con una tabella dbf e non direttamente con lo shapefile. Dico che non mi torna perché vorrei usare il campo FID nella condizione ON del join, ma il FID non compare nel dbf.
Ho capito male il funzionamento di ogr2ogr?

Ale


On 05/21/2013 05:17 PM, Paolo Corti wrote:
2013/5/21 Alessandro Sarretta [hidden email]:
Grazie Paolo,
la concatenzazione funzia a dovere!
Esiste una modalità (o una documentazione per approfondire) per farlo al di
fuori dell'interfaccia di QGIS?
Ale

Puoi usare la sintassi GDAL OGR SQL [1], e mediante ogr2ogr fare una
cosa di questo tipo:

$ ogr2ogr output.shp input.shp -sql 'SELECT *, CONCAT(field1, field2)
AS output FROM input'

ciao
p

[1] http://www.gdal.org/ogr/ogr_sql.html



-- 
Alessandro Sarretta

e-mail: [hidden email]
skype: alesarrett
Web: http://ilsarrett.wordpress.com
Twitter: https://twitter.com/alesarrett
Google scholar: http://scholar.google.it/citations?hl=it&user=IsyXargAAAAJ
ORCID: http://orcid.org/0000-0002-1475-8686
ResearchGate: https://www.researchgate.net/profile/Alessandro_Sarretta/ 

_______________________________________________
[hidden email]
http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss
Questa e' una lista di discussione pubblica aperta a tutti.
I messaggi di questa lista non hanno relazione diretta con le posizioni dell'Associazione GFOSS.it.
638 iscritti al 28.2.2013
Reply | Threaded
Open this post in threaded view
|

Re: Concatenazione di stringhe in uno shapefile

Andrea Peri
FID è il FeatureID .
Nello shapefile esso corrisponde alla posiione nel record.
Con esso si lega il record degli attributi del dbf con il record delle geometrie nel file shp e con l'indice spaziale nel file .shx.

Nei DBMS , se la tabella è dotata di chiave primaria intera, il FID corrisponde alla chiave primaria. ALtrimenti credo che lo crei con la medesima regola posizionale.



Il giorno 23 maggio 2013 07:26, Alessandro Sarretta <[hidden email]> ha scritto:
Grazie di nuovo Paolo.
Sto giocando ancora con ogr, questa volta per fare un join tra due shapefiles.
Con il seguente comando faccio il join tra input.shp e inputJoin.shp, sputando il risultato in output.shp

ogr2ogr -f "ESRI Shapefile" -overwrite output.shp input.shp -sql "SELECT input.*, CONCAT(substr(input.fieldX,1,2), substr(inputJoin.fieldY,1)) AS conc FROM input LEFT JOIN 'inputJoin.dbf'.inputJoin ON input.ID = inputJoin.ID"


Quello che non mi torna molto è che sembra che il join si debba fare (ho trovato alcuni esempi simili) con una tabella dbf e non direttamente con lo shapefile. Dico che non mi torna perché vorrei usare il campo FID nella condizione ON del join, ma il FID non compare nel dbf.
Ho capito male il funzionamento di ogr2ogr?

Ale



On 05/21/2013 05:17 PM, Paolo Corti wrote:
2013/5/21 Alessandro Sarretta [hidden email]:
Grazie Paolo,
la concatenzazione funzia a dovere!
Esiste una modalità (o una documentazione per approfondire) per farlo al di
fuori dell'interfaccia di QGIS?
Ale

Puoi usare la sintassi GDAL OGR SQL [1], e mediante ogr2ogr fare una
cosa di questo tipo:

$ ogr2ogr output.shp input.shp -sql 'SELECT *, CONCAT(field1, field2)
AS output FROM input'

ciao
p

[1] http://www.gdal.org/ogr/ogr_sql.html



-- 
Alessandro Sarretta

e-mail: [hidden email]

_______________________________________________
[hidden email]
http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss
Questa e' una lista di discussione pubblica aperta a tutti.
I messaggi di questa lista non hanno relazione diretta con le posizioni dell'Associazione GFOSS.it.
638 iscritti al 28.2.2013



--
-----------------
Andrea Peri
. . . . . . . . .
qwerty àèìòù
-----------------

_______________________________________________
[hidden email]
http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss
Questa e' una lista di discussione pubblica aperta a tutti.
I messaggi di questa lista non hanno relazione diretta con le posizioni dell'Associazione GFOSS.it.
638 iscritti al 28.2.2013
Reply | Threaded
Open this post in threaded view
|

Re: Concatenazione di stringhe in uno shapefile

Alessandro Sarretta
Grazie Andrea.
Però il dbf non contiene il FID e, per ora, il JOIN in ogr sono riuscito ad applicarlo solo tra uno shapefile e un dbf.
Altra cosa che sto provando è aggiungere un campo nello shapefile in cui copiare i valori del FID, in modo da averceli poi anche nel dbf.
Per la creazione del nuovo campo  ci sono, con il comando "ogrinfo -sql "ALTER TABLE shapefile ADD COLUMN FID_ integer" shapefile.shp")
Per l'inserimento dei valori, non riesco a capire se con ogr riesco a fare l'update dei valori di un campo...
Ale

On 05/23/2013 09:14 AM, Andrea Peri wrote:
FID è il FeatureID .
Nello shapefile esso corrisponde alla posiione nel record.
Con esso si lega il record degli attributi del dbf con il record delle geometrie nel file shp e con l'indice spaziale nel file .shx.

Nei DBMS , se la tabella è dotata di chiave primaria intera, il FID corrisponde alla chiave primaria. ALtrimenti credo che lo crei con la medesima regola posizionale.



Il giorno 23 maggio 2013 07:26, Alessandro Sarretta <[hidden email]> ha scritto:
Grazie di nuovo Paolo.
Sto giocando ancora con ogr, questa volta per fare un join tra due shapefiles.
Con il seguente comando faccio il join tra input.shp e inputJoin.shp, sputando il risultato in output.shp

ogr2ogr -f "ESRI Shapefile" -overwrite output.shp input.shp -sql "SELECT input.*, CONCAT(substr(input.fieldX,1,2), substr(inputJoin.fieldY,1)) AS conc FROM input LEFT JOIN 'inputJoin.dbf'.inputJoin ON input.ID = inputJoin.ID"


Quello che non mi torna molto è che sembra che il join si debba fare (ho trovato alcuni esempi simili) con una tabella dbf e non direttamente con lo shapefile. Dico che non mi torna perché vorrei usare il campo FID nella condizione ON del join, ma il FID non compare nel dbf.
Ho capito male il funzionamento di ogr2ogr?

Ale



On 05/21/2013 05:17 PM, Paolo Corti wrote:
2013/5/21 Alessandro Sarretta [hidden email]:
Grazie Paolo,
la concatenzazione funzia a dovere!
Esiste una modalità (o una documentazione per approfondire) per farlo al di
fuori dell'interfaccia di QGIS?
Ale

Puoi usare la sintassi GDAL OGR SQL [1], e mediante ogr2ogr fare una
cosa di questo tipo:

$ ogr2ogr output.shp input.shp -sql 'SELECT *, CONCAT(field1, field2)
AS output FROM input'

ciao
p

[1] http://www.gdal.org/ogr/ogr_sql.html



-- 
Alessandro Sarretta

e-mail: [hidden email]

_______________________________________________
[hidden email]
http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss
Questa e' una lista di discussione pubblica aperta a tutti.
I messaggi di questa lista non hanno relazione diretta con le posizioni dell'Associazione GFOSS.it.
638 iscritti al 28.2.2013



--
-----------------
Andrea Peri
. . . . . . . . .
qwerty àèìòù
-----------------


-- 
Alessandro Sarretta

e-mail: [hidden email]
skype: alesarrett
Web: http://ilsarrett.wordpress.com
Twitter: https://twitter.com/alesarrett
Google scholar: http://scholar.google.it/citations?hl=it&user=IsyXargAAAAJ
ORCID: http://orcid.org/0000-0002-1475-8686
ResearchGate: https://www.researchgate.net/profile/Alessandro_Sarretta/ 

_______________________________________________
[hidden email]
http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss
Questa e' una lista di discussione pubblica aperta a tutti.
I messaggi di questa lista non hanno relazione diretta con le posizioni dell'Associazione GFOSS.it.
638 iscritti al 28.2.2013
Reply | Threaded
Open this post in threaded view
|

Re: Concatenazione di stringhe in uno shapefile

Paolo Corti
2013/5/23 Alessandro Sarretta <[hidden email]>:

> Grazie Andrea.
> Però il dbf non contiene il FID e, per ora, il JOIN in ogr sono riuscito ad
> applicarlo solo tra uno shapefile e un dbf.
> Altra cosa che sto provando è aggiungere un campo nello shapefile in cui
> copiare i valori del FID, in modo da averceli poi anche nel dbf.
> Per la creazione del nuovo campo  ci sono, con il comando "ogrinfo -sql
> "ALTER TABLE shapefile ADD COLUMN FID_ integer" shapefile.shp")
> Per l'inserimento dei valori, non riesco a capire se con ogr riesco a fare
> l'update dei valori di un campo...
> Ale
>

Non penso proprio si possa fare in un unico passaggio. Secondo me ti
conviene fare cosi per ognuno dei due shapefile:

ogr2ogr output_join1.shp shape1.shp -sql "SELECT *, FID as JOINFIELD
FROM shape1"
ogr2ogr output_join2.shp shape2.shp -sql "SELECT *, FID as JOINFIELD
FROM shape2"

e poi joinare sul campo JOINFIELD (output_join1.JOINFIELD =
output_join2.JOINFIELD)

ciao
p

--
Paolo Corti
Geospatial software developer
web: http://www.paolocorti.net
twitter: @capooti
skype: capooti
_______________________________________________
[hidden email]
http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss
Questa e' una lista di discussione pubblica aperta a tutti.
I messaggi di questa lista non hanno relazione diretta con le posizioni dell'Associazione GFOSS.it.
638 iscritti al 28.2.2013
Reply | Threaded
Open this post in threaded view
|

Re: Concatenazione di stringhe in uno shapefile

Alessandro Sarretta
Grazie Paolo di nuovo,
ora funzia tutto alla perfezione!
Ale

On 05/23/2013 09:31 AM, Paolo Corti wrote:

>
> Non penso proprio si possa fare in un unico passaggio. Secondo me ti
> conviene fare cosi per ognuno dei due shapefile:
>
> ogr2ogr output_join1.shp shape1.shp -sql "SELECT *, FID as JOINFIELD
> FROM shape1"
> ogr2ogr output_join2.shp shape2.shp -sql "SELECT *, FID as JOINFIELD
> FROM shape2"
>
> e poi joinare sul campo JOINFIELD (output_join1.JOINFIELD =
> output_join2.JOINFIELD)
>
> ciao
> p
>


--
Alessandro Sarretta

e-mail: [hidden email]
skype: alesarrett
Web: http://ilsarrett.wordpress.com
Twitter: https://twitter.com/alesarrett
Google scholar: http://scholar.google.it/citations?hl=it&user=IsyXargAAAAJ
ORCID: http://orcid.org/0000-0002-1475-8686
ResearchGate: https://www.researchgate.net/profile/Alessandro_Sarretta/

_______________________________________________
[hidden email]
http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss
Questa e' una lista di discussione pubblica aperta a tutti.
I messaggi di questa lista non hanno relazione diretta con le posizioni dell'Associazione GFOSS.it.
638 iscritti al 28.2.2013
Reply | Threaded
Open this post in threaded view
|

Re: Concatenazione di stringhe in uno shapefile

Andrea Peri
In reply to this post by Alessandro Sarretta
io proverei a usare OGRINFO con la clausola -sql




Il giorno 23 maggio 2013 09:25, Alessandro Sarretta <[hidden email]> ha scritto:
Grazie Andrea.
Però il dbf non contiene il FID e, per ora, il JOIN in ogr sono riuscito ad applicarlo solo tra uno shapefile e un dbf.
Altra cosa che sto provando è aggiungere un campo nello shapefile in cui copiare i valori del FID, in modo da averceli poi anche nel dbf.
Per la creazione del nuovo campo  ci sono, con il comando "ogrinfo -sql "ALTER TABLE shapefile ADD COLUMN FID_ integer" shapefile.shp")
Per l'inserimento dei valori, non riesco a capire se con ogr riesco a fare l'update dei valori di un campo...
Ale


On 05/23/2013 09:14 AM, Andrea Peri wrote:
FID è il FeatureID .
Nello shapefile esso corrisponde alla posiione nel record.
Con esso si lega il record degli attributi del dbf con il record delle geometrie nel file shp e con l'indice spaziale nel file .shx.

Nei DBMS , se la tabella è dotata di chiave primaria intera, il FID corrisponde alla chiave primaria. ALtrimenti credo che lo crei con la medesima regola posizionale.



Il giorno 23 maggio 2013 07:26, Alessandro Sarretta <[hidden email]> ha scritto:
Grazie di nuovo Paolo.
Sto giocando ancora con ogr, questa volta per fare un join tra due shapefiles.
Con il seguente comando faccio il join tra input.shp e inputJoin.shp, sputando il risultato in output.shp

ogr2ogr -f "ESRI Shapefile" -overwrite output.shp input.shp -sql "SELECT input.*, CONCAT(substr(input.fieldX,1,2), substr(inputJoin.fieldY,1)) AS conc FROM input LEFT JOIN 'inputJoin.dbf'.inputJoin ON input.ID = inputJoin.ID"


Quello che non mi torna molto è che sembra che il join si debba fare (ho trovato alcuni esempi simili) con una tabella dbf e non direttamente con lo shapefile. Dico che non mi torna perché vorrei usare il campo FID nella condizione ON del join, ma il FID non compare nel dbf.
Ho capito male il funzionamento di ogr2ogr?

Ale



On 05/21/2013 05:17 PM, Paolo Corti wrote:
2013/5/21 Alessandro Sarretta [hidden email]:
Grazie Paolo,
la concatenzazione funzia a dovere!
Esiste una modalità (o una documentazione per approfondire) per farlo al di
fuori dell'interfaccia di QGIS?
Ale

Puoi usare la sintassi GDAL OGR SQL [1], e mediante ogr2ogr fare una
cosa di questo tipo:

$ ogr2ogr output.shp input.shp -sql 'SELECT *, CONCAT(field1, field2)
AS output FROM input'

ciao
p

[1] http://www.gdal.org/ogr/ogr_sql.html



-- 
Alessandro Sarretta

e-mail: [hidden email]

_______________________________________________
[hidden email]
http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss
Questa e' una lista di discussione pubblica aperta a tutti.
I messaggi di questa lista non hanno relazione diretta con le posizioni dell'Associazione GFOSS.it.
638 iscritti al 28.2.2013



--
-----------------
Andrea Peri
. . . . . . . . .
qwerty àèìòù
-----------------


-- 
Alessandro Sarretta

e-mail: [hidden email]
skype: alesarrett
Web: http://ilsarrett.wordpress.com
Twitter: https://twitter.com/alesarrett
Google scholar: http://scholar.google.it/citations?hl=it&user=IsyXargAAAAJ
ORCID: http://orcid.org/0000-0002-1475-8686
ResearchGate: https://www.researchgate.net/profile/Alessandro_Sarretta/ 



--
-----------------
Andrea Peri
. . . . . . . . .
qwerty àèìòù
-----------------

_______________________________________________
[hidden email]
http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss
Questa e' una lista di discussione pubblica aperta a tutti.
I messaggi di questa lista non hanno relazione diretta con le posizioni dell'Associazione GFOSS.it.
638 iscritti al 28.2.2013