Hallo Lucas,
Lucas Mengel schrieb:
> ich habe mir ein SQL-Statement gebastelt, um "Stadtname, lon, lat,
> postleitzahl" auszugeben.
> Das dient dem Zweck, dass ich mir eine eigene, einfacherer Architektur
> erstellen möchte, die nur diejenigen Daten enthält,
> die ich auch wirklich benötige.
>
> Bevor ich das Problem beschreibe, hier mein Ansatz:
>
> SELECT
> plz.text_val AS stadt,
> position.lon,
> position.lat,
> FROM
> geodb_textdata plz,
> geodb_textdata ort,
> geodb_coordinates position
> WHERE
> position.loc_id = plz.loc_id AND
> ort.loc_id = plz.loc_id AND
> plz.text_type = 500300000 AND
> ort.text_type = 500100000
> ORDER BY 2
>
>
> Nun zum Problemchen: Wie schaffe ich es, das Ergebnis auf Orte in
> Deutschland zu beschränken?
Das Statement mit hinzugefügter Beschränkung auf Deutschland sieht so aus:
SELECT
plz.text_val AS stadt,
position.lon,
position.lat
FROM
geodb_textdata plz,
geodb_textdata ort,
geodb_textdata land,
geodb_coordinates position,
geodb_locations lo,
geodb_hierarchies hi
WHERE
lo.loc_type = 100200000 /* State */
AND lo.loc_id = land.loc_id
AND land.text_type = 500100001 /* ISO_3166_1_ALPHA_2 */
AND land.text_val = 'DE'
AND hi.id_lvl2 = lo.loc_id
AND hi.loc_id = plz.loc_id
AND position.loc_id = plz.loc_id
AND ort.loc_id = plz.loc_id
AND plz.text_type = 500300000
AND ort.text_type = 500100000
ORDER BY 2
Aber vielleicht solltest Du lieber das folgende Statement verwenden, das
liefert genauere Koordinaten (dafür aber weniger Einträge):
SELECT DISTINCT text_val, lon, lat
FROM geodb_coordinates co, geodb_textdata tx,
geodb_locations lo, geodb_hierarchies hi
WHERE lo.loc_id = tx.loc_id
AND lo.loc_id = co.loc_id
AND lo.loc_id = hi.loc_id
AND loc_type = 100800000 /* LOC_AREA_CODE */
AND text_type = 500100000 /* NAME */
Derlei Einträge existieren aber derzeit nur für Deutschland, für Österreich
und die Schweiz musst Du auf die Einträge vom Typ 100700000 (POPULATED AREA)
zurückgreifen, die weniger genau sind und für diese den Text des Typs
500300000 (AREA_CODE) heraussuchen:
SELECT DISTINCT tx.text_val AS plz, hi.id_lvl2 AS staat, lon, lat
FROM geodb_textdata tx, geodb_locations lo,
geodb_coordinates co, geodb_hierarchies hi
WHERE text_type = 500300000 /* AREA_CODE */
AND lo.loc_id = tx.loc_id
AND lo.loc_id = hi.loc_id
AND lo.loc_id = co.loc_id
AND lo.loc_type = 100700000 /* POPULATED AREA */
AND id_lvl2 IN (
SELECT DISTINCT tx.loc_id
FROM geodb_textdata tx, geodb_locations lo
WHERE text_val in ('AT', 'CH')
AND text_type = 500100001 /* ISO_3166_1_ALPHA_2 */
AND tx.loc_id = lo.loc_id
AND lo.loc_type = 100200000 /* State */
Der Subselect liefert übrigens immer "106,107" als loc_id für AT und CH, das
wird sich vermutlich nicht mal so eben ändern.
Gruss,
-Sven Neuhaus
--
Mailingliste OpenGeoDB
Listenadresse:
opengeodb@...
Informationen:
http://opengeodb.deMit freundlicher Unterstütztung von php::bar (
http://phpbar.de)