« Return to Thread: stadtname, lon, lat, postleitzahl - nur aus deutschland

Re: stadtname, lon, lat, postleitzahl - nur aus deutschland

by Sven Neuhaus :: Rate this Message:

Reply to Author | View in Thread

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.de
Mit freundlicher Unterstütztung von php::bar (http://phpbar.de)

 « Return to Thread: stadtname, lon, lat, postleitzahl - nur aus deutschland