Interogare caracteristici cu WFS
Scenariu: Trebuie să recuperezi caracteristici geografice brute dintr-un strat Qarta pentru analiză, export sau procesare aval. Vrei să filtrezi după locație (caseta de delimitare) sau atribute (filtru CQL) și să recuperezi datele ca GeoJSON.
Flux de lucru:
- Utilizează
DescribeLayerpentru a găsitypeNamesWFS pentru un strat - Apelează
GetFeaturecu filtre și format de ieșire - Parsează GeoJSON și procesează caracteristici în aplicația ta
- Pagineaza prin seturi mari de rezultate dacă este necesar
Pasul 1: Obții metadate strat
Utilizează operația WMS DescribeLayer pentru a găsi numele stratului WFS corespunzător:
- cURL
curl -X GET "https://graph.quarticle.ro/graph/layers/wms/DescribeLayer" \
-H "Authorization: YOUR_API_KEY" \
-G \
-d "service=WMS" \
-d "version=1.1.1" \
-d "request=DescribeLayer" \
-d "layers=GRAPHRASTER:cities"
Din răspuns, extrage WFS typeNames (de obicei același cu numele stratului).
Pasul 2: Interoghem caracteristici după caseta de delimitare
Recuperează toate caracteristicile dintr-o zonă geografică:
- cURL
- Python
# Orașe în zona New York (bbox în EPSG:4326)
curl -X GET "https://graph.quarticle.ro/graph/layers/wfs/GetFeature" \
-H "Authorization: YOUR_API_KEY" \
-G \
-d "service=WFS" \
-d "version=2.0.0" \
-d "request=GetFeature" \
-d "typeNames=GRAPHRASTER:cities" \
-d "bbox=-74.1,40.6,-73.9,40.8,EPSG:4326" \
-d "outputFormat=application/json" \
| jq '.features[] | .properties'
import requests
api_key = os.getenv('QARTA_API_KEY')
response = requests.get(
'https://graph.quarticle.ro/graph/layers/wfs/GetFeature',
params={
'service': 'WFS',
'version': '2.0.0',
'request': 'GetFeature',
'typeNames': 'GRAPHRASTER:cities',
'bbox': '-74.1,40.6,-73.9,40.8,EPSG:4326',
'outputFormat': 'application/json'
},
headers={'Authorization': f'{api_key}'}
)
geojson = response.json()
for feature in geojson['features']:
print(f"{feature['properties']['name']}: {feature['properties']['population']}")
Pasul 3: Interoghem caracteristici după atribute (filtru CQL)
Filtrează caracteristici folosind condiții de atribute:
- Filtru atribut simplu
- Exemplu cURL
# Orașe cu populație > 1 milion
cql_filter=population > 1000000
curl -X GET "https://graph.quarticle.ro/graph/layers/wfs/GetFeature" \
-H "Authorization: YOUR_API_KEY" \
-G \
-d "service=WFS" \
-d "version=2.0.0" \
-d "request=GetFeature" \
-d "typeNames=GRAPHRASTER:cities" \
-d "cql_filter=population > 1000000 AND country = 'USA'" \
-d "outputFormat=application/json"
Pasul 4: Combină filtre spațiale și de atribute
Filtrează după locație și atribute:
- cURL
curl -X GET "https://graph.quarticle.ro/graph/layers/wfs/GetFeature" \
-H "Authorization: YOUR_API_KEY" \
-G \
-d "service=WFS" \
-d "version=2.0.0" \
-d "request=GetFeature" \
-d "typeNames=GRAPHRASTER:cities" \
-d "bbox=-74.1,40.6,-73.9,40.8,EPSG:4326" \
-d "cql_filter=population > 100000" \
-d "propertyName=name,population,geometry" \
-d "outputFormat=application/json"
Pasul 5: Pagineaza prin seturi mari de rezultate
Pentru seturi de date mari, pagineaza pentru a evita timeout-urile:
- Python
import requests
def get_all_features(type_names, cql_filter=None):
api_key = os.getenv('QARTA_API_KEY')
page_size = 100
all_features = []
page = 0
while True:
params = {
'service': 'WFS',
'version': '2.0.0',
'request': 'GetFeature',
'typeNames': type_names,
'count': page_size,
'startIndex': page * page_size,
'outputFormat': 'application/json'
}
if cql_filter:
params['cql_filter'] = cql_filter
response = requests.get(
'https://graph.quarticle.ro/graph/layers/wfs/GetFeature',
params=params,
headers={'Authorization': f'{api_key}'}
)
geojson = response.json()
count = len(geojson['features'])
all_features.extend(geojson['features'])
print(f'Page {page + 1}: Retrieved {count} features (total: {len(all_features)})')
if count < page_size:
break
page += 1
return all_features
cities = get_all_features('GRAPHRASTER:cities', "population > 50000")
print(f'Total: {len(cities)} cities')
Pasul 6: Export la CSV sau fișier
Salveaza caracteristici interiogate în fișier:
- Python — Export CSV
import csv
import json
def export_features_to_csv(type_names, filename):
features = get_all_features(type_names)
if not features:
print('No features to export')
return
# Extrage toate cheile proprietate
all_keys = set()
for feature in features:
all_keys.update(feature['properties'].keys())
all_keys = sorted(list(all_keys))
with open(filename, 'w', newline='', encoding='utf-8') as f:
writer = csv.DictWriter(f, fieldnames=['geometry'] + all_keys)
writer.writeheader()
for feature in features:
row = {
'geometry': json.dumps(feature['geometry']),
**feature['properties']
}
writer.writerow(row)
print(f'Exported {len(features)} features to {filename}')
export_features_to_csv('GRAPHRASTER:cities', 'cities.csv')
Pasul 7: Interogări spațiale (avansat)
Utilizează funcții spațiale CQL pentru a interoga caracteristici:
- Caracteristici la distanță
- Caracteristici care conțin punct
# Orașe în 10km de Times Square
cql_filter=DWITHIN(geometry, POINT(-73.9857 40.7580), 10000, meters)
# Districte care conțin un punct
cql_filter=CONTAINS(geometry, POINT(-73.9857 40.7580))
Exemplu flux de lucru complet
- Python
import requests
import json
import statistics
API_KEY = os.getenv('QARTA_API_KEY')
def analyze_metropolitan_areas():
print('Querying metropolitan areas...')
params = {
'service': 'WFS',
'version': '2.0.0',
'request': 'GetFeature',
'typeNames': 'GRAPHRASTER:cities',
'cql_filter': "type = 'metropolitan' AND population > 1000000",
'propertyName': 'name,population,area,country',
'sortBy': 'population D',
'outputFormat': 'application/json'
}
response = requests.get(
'https://graph.quarticle.ro/graph/layers/wfs/GetFeature',
params=params,
headers={'Authorization': f'{API_KEY}'}
)
geojson = response.json()
# Analizează
populations = []
cities_data = []
for feature in geojson['features']:
props = feature['properties']
population = props['population']
area = props['area']
density = population / area if area > 0 else 0
populations.append(population)
cities_data.append({
'name': props['name'],
'population': population,
'area': area,
'country': props['country'],
'density': round(density, 0)
})
analysis = {
'totalCities': len(cities_data),
'totalPopulation': sum(populations),
'averagePopulation': round(statistics.mean(populations)),
'cities': cities_data
}
# Export
with open('metropolitan_analysis.json', 'w') as f:
json.dump(analysis, f, indent=2)
print(f'Analysis complete: {analysis["totalCities"]} cities analyzed')
return analysis
analyze_metropolitan_areas()
Cazuri de utilizare
- Analiză imobiliare: Interoghem proprietăți în zone specifice și intervale de preț
- Date de mediu: Descarcă date poluare, climă sau vegetație pentru analiză
- Planificare urbană: Extrage date zoning, infrastructură sau demografie
- Cercetare: Descarcă în bulk caracteristici geografice pentru analiză spațială
- Pipeline date: Integrează interogări WFS în procese ETL
Pași următori
- Ghid WFS — Aprinde toți parametrii GetFeature și sintaxa CQL
- Caz de utilizare vizualizare hartă — Afișează caracteristici pe hărți
- Prezentare generală GeoServer — Înțelege WMS vs WFS