Sări la conținutul principal

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:

  1. Utilizează DescribeLayer pentru a găsi typeNames WFS pentru un strat
  2. Apelează GetFeature cu filtre și format de ieșire
  3. Parsează GeoJSON și procesează caracteristici în aplicația ta
  4. 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 -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ă:

# 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'

Pasul 3: Interoghem caracteristici după atribute (filtru CQL)

Filtrează caracteristici folosind condiții de atribute:

# Orașe cu populație > 1 milion
cql_filter=population > 1000000

Pasul 4: Combină filtre spațiale și de atribute

Filtrează după locație și atribute:

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:

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:

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:

# Orașe în 10km de Times Square
cql_filter=DWITHIN(geometry, POINT(-73.9857 40.7580), 10000, meters)

Exemplu flux de lucru complet

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