2017-02-09 2 views
0

Ich wurde vor kurzem Daten in einer Form Dateiprojektion EPSG: 4326 geliefert. Ich importiert diese in meine PostGIS Datenbank und dann versucht zu 3857. ich den FehlerFinden Geometrien mit Koordinaten, die nicht in die Projektion gehören

ERROR: transform: couldn't project point (-99762.4 -2.87277e+006 0): latitude or longitude exceeded limits (-14)

Auch nach st_force2d und st_makevalid Anwendung kam zu verwandeln konnte ich noch nicht verwandeln, bis ich ein Löschen der eine auf die Spur verwaltet Geometrie, die für Lat/Lng "außerhalb der Grenzen" war.

Meine Frage ist: Wie finde ich leicht Geometrien, die nicht in den aktuellen Projektionen Umschlag passen?

Antwort

1

Bei 4326 sollte diese Arbeit:

SELECT * FROM your_table WHERE 
    (st_x(geom) NOT BETWEEN -180 AND 180) 
    OR 
    (st_y(geom) NOT BETWEEN -90 AND 90) ; 
+0

Die Daten bestehen aus Polygonen, auch wenn der Fehler auf den ersten Punkt berichtet, dass es wurde aufgeklebt. Mit einer leichten Modifikation wird dies mit Polygonen umgehen. Idealerweise suche ich nach einer generischen Art, mit jeder Projektion umzugehen. Wahrscheinlich, indem man zuerst den Umschlag der Projektion bekommt? – Derek

+0

@Derek, siehe meine andere Antwort unten –

1

(ich dies als einen Kommentar hinterlassen haben würde, aber da kann ich nicht, hier ist es.)

diese Antwort hilfreich sein könnte : Get projection limits from Postgis

Grundsätzlich gilt:

  1. PostGIS kennt die Grenzen einer Projektion nicht und Sie müssten eine neue Tabelle erstellen, um sie zu sammeln.

  2. Auch wenn der Wert in den Grenzen einer Projektion enthalten ist, bedeutet dies nicht, dass es für diese Projektion richtig ist. Diese Methode kann nur sicherstellen, dass der Transformationsprozess fortgesetzt wird und Ihnen ein Ergebnis liefert. Es kann nicht sichergestellt werden, dass die Daten korrekt sind.

0

Für eine generische Lösung, könnten Sie eine benutzerdefinierte Transformationsfunktion verwenden, die den Fehler fangen:

CREATE OR REPLACE FUNCTION transform_safe(geom geometry, srid int) RETURNS geometry AS $$ 
BEGIN 
    IF ST_Srid(geom) = 0 THEN 
    RAISE Exception 'Input geometry has unknown (0) SRID'; 
    END IF; 
    BEGIN 
    RETURN ST_Transform(geom, srid); 
    EXCEPTION WHEN internal_error THEN 
    RAISE WARNING '%: %',SQLSTATE,SQLERRM; 
    END; 
    RETURN NULL; 
END; 

$$ 
language plpgsql; 

Dies ist die gleiche wie ST_Transform verhält sich aber gibt NULL zurück, wenn die Koordinaten außerhalb der Grenzen sind.

In Beispiel so könnten Sie die Datensätze mit ungültigen Koordinaten identifizieren:

SELECT id FROM polygon_table WHERE transform_safe(geom) IS NULL AND geom IS NOT NULL; 
Verwandte Themen