Skip to content

Instantly share code, notes, and snippets.

@pigreco
Last active March 17, 2024 14:58
Show Gist options
  • Save pigreco/86589dddf5a59b3a7650267d5af237bd to your computer and use it in GitHub Desktop.
Save pigreco/86589dddf5a59b3a7650267d5af237bd to your computer and use it in GitHub Desktop.
# -*- coding: utf-8 -*-
"""
/***************************************************************************
WMS Catasto Agenzia delle Entrate CC BY 4.0
-------------------
copyright : (C) 2020 by Giulio Fattori
email : xxxxx.xxxxxxx@xxxxx.it
***************************************************************************/
"""
from qgis.core import *
from qgis.gui import *
import requests
@qgsfunction(args='auto', group='Custom')
def get_parcel_info2(xx, yy, EPSG, feature, parent):
"""
<h1>WMS Catasto Agenzia delle Entrate CC BY 4.0:</h1><br>
La funzione, tramite una richiesta GetFeatureInfo, restituisce le informazioni utili sulla particella che ricade sotto il pixel di mio interesse:
<h2>Esempio:</h2>
<ul>
<li>get_parcel_info(355461.5,4222490.7,'EPSG:3045') -> 'IT.AGE.PLA.G273_0033A0.673'</li>
<li>get_parcel_info("fieldX", "fieldY",'EPSG:3045') -> 'IT.AGE.PLA.G273_0033A0.673'</li>
<li>get_parcel_info("fieldX", "fieldY",@project_crs) -> 'IT.AGE.PLA.G273_0033A0.673'</li>
</ul>
<h2>NB: le coordinate X e Y devono essere espresse nel EPSG utilizzato (gli EPSG disponibili sono:6706,4258,25832/3/4,3044/5/6)</h2>
"""
req = "https://wms.cartografia.agenziaentrate.gov.it/inspire/wms/ows01.php?REQUEST=GetFeatureInfo&SERVICE=WMS&SRS="+EPSG+"&STYLES=&VERSION=1.1&FORMAT=image/png&BBOX="+str(xx-1)+","+str(yy-1)+","+str(xx+1)+","+str(yy+1)+"&HEIGHT=9&WIDTH=9&LAYERS=CP.CadastralParcel&QUERY_LAYERS=CP.CadastralParcel&INFO_FORMAT=text/html&X=5&Y=5"
r = requests.get(req, auth=('user', 'pass'))
a = r.text.partition("InspireId localId</th><td>")[2]
b = a.partition("</td>")[0]
return b
@pigreco
Copy link
Author

pigreco commented Oct 1, 2020

Creare un vettore puntuale, per esempio in un GeoPackage e definire solo il campo fid, gli altri campi li definiamo come campi virtuali, ecco le definizioni:

  • fid : -
  • x : x($geometry)
  • y : y($geometry)
  • catasto : get_parcel_info( "x" , "y" )
  • codice : regexp_replace( "catasto" ,'^(.+)\\.(.+)\\.(.+)\\.(.+)_(.+)\\.(.+)$', '\\4')
  • foglio : regexp_replace( "catasto" ,'^(.+)\\.(.+)\\.(.+)\\.(.+)_(.+)\\.(.+)$', '\\5')
  • particella : regexp_replace( "catasto" ,'^(.+)\\.(.+)\\.(.+)\\.(.+)_(.+)\\.(.+)$', '\\6')

EDIT

  • IT.AGE.PLA.G273_011800.485 caso senza sezione
  • IT.AGE.PLA.B354A0018V0.2261 caso con sezione

Alcuni comuni presentano delle sezioni e quindi la stringa estratta da get_parcel_info() puo' variare, per tenere conto di questi casi occorre utilizzare le seguenti espressioni:

  • codice :
/*campo codice comune 4 caratteri*/
substr(
regexp_replace(  "catasto" ,'^(.+)\\.(.+)\\.(.+)\\.(.+)\\.(.+)$', '\\4'),1,4)
  • sezione:
/*campo sezione 1 carattere*/
substr(
regexp_replace(  "catasto" ,'^(.+)\\.(.+)\\.(.+)\\.(.+)\\.(.+)$', '\\4'),5,1)
  • foglio :
/*campo foglio 4 caratteri*/
substr(
regexp_replace(  "catasto" ,'^(.+)\\.(.+)\\.(.+)\\.(.+)\\.(.+)$', '\\4'),6,4)
  • allegato:
/*campo allegato 1 carattere*/
substr(
regexp_replace(  "catasto" ,'^(.+)\\.(.+)\\.(.+)\\.(.+)\\.(.+)$', '\\4'),10,1)
  • sviluppo:
/*campo sviluppo 1 carattere*/
substr(
regexp_replace(  "catasto" ,'^(.+)\\.(.+)\\.(.+)\\.(.+)\\.(.+)$', '\\4'),11,1)
  • particella :
/*campo particella variabile*/
regexp_replace(  "catasto" ,'^(.+)\\.(.+)\\.(.+)\\.(.+)\\.(.+)$', '\\5')

Video demo:

add_col_area_perimetro

add_col_area_perimetro

/*estrae il foglio e la particella catastale a partire da un poligono*/
with_variable('fp',
		with_variable('geom3045',
				transform($geometry,'EPSG:4326', @project_crs ),
				get_parcel_info( 
						x( point_on_surface( @geom3045)),
						y( point_on_surface( @geom3045)))),
	regexp_replace( @fp ,'^(.+)\\.(.+)\\.(.+)\\.(.+)_(.+)\\.(.+)$', '\\5/\\6')
			)

Corsi su QGIS

Se lo trovi utile dona : https://www.paypal.com/paypalme/pigrecoinfinito

@antatta
Copy link

antatta commented Jun 28, 2021

Creare un vettore puntuale, per esempio in un GeoPackage e definire solo il campo fid, gli altri campi li definiamo come campi virtuali, ecco le definizioni:

  • fid : -
  • x : x($geometry)
  • y : y($geometry)
  • catasto : get_parcel_info( "x" , "y" )
  • codice : regexp_replace( "catasto" ,'^(.+)\\.(.+)\\.(.+)\\.(.+)_(.+)\\.(.+)$', '\\4')
  • foglio : regexp_replace( "catasto" ,'^(.+)\\.(.+)\\.(.+)\\.(.+)_(.+)\\.(.+)$', '\\5')
  • particella : regexp_replace( "catasto" ,'^(.+)\\.(.+)\\.(.+)\\.(.+)_(.+)\\.(.+)$', '\\6')

EDIT

  • IT.AGE.PLA.G273_011800.485 caso senza sezione
  • IT.AGE.PLA.B354A0018V0.2261 caso con sezione

Alcuni comuni presentano delle sezioni e quindi la stringa estratta da get_parcel_info() puo' variare, per tenere conto di questi casi occorre utilizzare le seguenti espressioni:

  • codice :
/*campo codice comune 4 caratteri*/
substr(
regexp_replace(  "catasto" ,'^(.+)\\.(.+)\\.(.+)\\.(.+)\\.(.+)$', '\\4'),1,4)
  • sezione:
/*campo sezione 1 carattere*/
substr(
regexp_replace(  "catasto" ,'^(.+)\\.(.+)\\.(.+)\\.(.+)\\.(.+)$', '\\4'),5,1)
  • foglio :
/*campo foglio 4 caratteri*/
substr(
regexp_replace(  "catasto" ,'^(.+)\\.(.+)\\.(.+)\\.(.+)\\.(.+)$', '\\4'),6,4)
  • allegato:
/*campo allegato 1 carattere*/
substr(
regexp_replace(  "catasto" ,'^(.+)\\.(.+)\\.(.+)\\.(.+)\\.(.+)$', '\\4'),10,1)
  • sviluppo:
/*campo sviluppo 1 carattere*/
substr(
regexp_replace(  "catasto" ,'^(.+)\\.(.+)\\.(.+)\\.(.+)\\.(.+)$', '\\4'),11,1)
  • particella :
/*campo particella variabile*/
regexp_replace(  "catasto" ,'^(.+)\\.(.+)\\.(.+)\\.(.+)\\.(.+)$', '\\5')

Video demo:

add_col_area_perimetro

add_col_area_perimetro

/*estrae il foglio e la particella catastale a partire da un poligono*/
with_variable('fp',
		with_variable('geom3045',
				transform($geometry,'EPSG:4326', @project_crs ),
				get_parcel_info( 
						x( point_on_surface( @geom3045)),
						y( point_on_surface( @geom3045)))),
	regexp_replace( @fp ,'^(.+)\\.(.+)\\.(.+)\\.(.+)_(.+)\\.(.+)$', '\\5/\\6')
			)

Corsi su QGIS

Se lo trovi utile dona : https://www.paypal.com/paypalme/pigrecoinfinito

### Si potrebbe usare un'unica regex fatta così:
codice: regexp_matches( "catasto" ,'^(.+)\.(.+)\.(.+)\.(.{4})(.)(.+)\.(.+)')[3]
sezione: regexp_matches( "catasto" ,'^(.+)\.(.+)\.(.+)\.(.{4})(.)(.+)\.(.+)')[4]
foglio: regexp_matches( "catasto" ,'^(.+)\.(.+)\.(.+)\.(.{4})(.)(.+)\.(.+)')[5]
particella: regexp_matches( "catasto" ,'^(.+)\.(.+)\.(.+)\.(.{4})(.)(.+)\.(.+)')[6]

@pigreco
Copy link
Author

pigreco commented Jun 28, 2021

@antatta

Si potrebbe usare un'unica regex fatta così:

codice: regexp_matches( "catasto" ,'^(.+).(.+).(.+).(.{4})(.)(.+).(.+)')[3]
sezione: regexp_matches( "catasto" ,'^(.+).(.+).(.+).(.{4})(.)(.+).(.+)')[4]
foglio: regexp_matches( "catasto" ,'^(.+).(.+).(.+).(.{4})(.)(.+).(.+)')[5]
particella: regexp_matches( "catasto" ,'^(.+).(.+).(.+).(.{4})(.)(.+).(.+)')[6]

quasi, suggerirei così:

regexp_matches( "catasto" ,'^(.+)\\.(.+)\\.(.+)\\.(.+)_(.+)\\.(.+)$')[x]

con x che varia da 0 a 5

image

@antatta
Copy link

antatta commented Jun 30, 2021

mmmm direi che si può fare ancora meglio con:

regexp_matches( "catasto" ,'^(.+)\\.(.+)\\.(.+)\\.(.{4})(.)(.+)\\.(.+)')[x]

con x che varia da 0 a 6 e così si prende anche la sezione (se esiste, altrimenti '_')

image
image

PS: ti stimo, fai un ottimo lavoro di divulgazione

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment