3

PostGIS で EPSG:4326 から UTM (30N/EPSG:32630 または 29N/EPSG:32629) に変換したいと思います。次のクエリを実行しますが、間違った結果が得られます。

SELECT ST_AsText(ST_Transform(ST_GeomFromText('POINT(36.5277099609375 -5.86424016952515)',4326),32630)) As check;

UTM 30N に"POINT(5262418.33128724 -839958.963432011)"近いものになるはずの時期を取得します。243625.00,4046330.004326 から UTM に変換すると正しい結果が得られますが、UTM から 4326 にはなりません。

  • クエリの何が問題になっていますか?
  • また、EPSG:4326 の座標から UTM タイムゾーンを取得する方法はありますか?それらが 30N に属しているか 29N に属しているかがわからないためですか?
4

3 に答える 3

8

1) クエリは正しいですが、座標が反転しています。WKT形式での正しい座標順序はPOINT(x y)、また、POINT(longitude latitude)

このクエリにより、期待される結果が得られます。

SELECT ST_AsText(ST_Transform(ST_GeomFromText('POINT(-5.86424016952515 36.5277099609375)',4326),32630)) As check;

2) 緯度/経度のジオメトリから UTM ゾーンを取得するには、次の式を使用できます。

ST_X(input_geometry)+180)/6)+1

いくつかの調整を加えて。

この目的のために、次の関数を使用します。

CREATE OR REPLACE FUNCTION get_utmzone(input_geom geometry)
  RETURNS integer AS
$BODY$
DECLARE
   zone int;
   pref int;
BEGIN
   IF GeometryType(input_geom) != 'POINT' THEN
     RAISE EXCEPTION 'Input geom must be a point. Currently is: %', GeometryType(input_geom);
   END IF;
   IF ST_Y(input_geom) >0 THEN
      pref:=32600;
   ELSE
      pref:=32700;
   END IF;
   zone = floor((ST_X(input_geom)+180)/6)+1;
   RETURN zone+pref;
END;
$BODY$
LANGUAGE plpgsql IMMUTABLE;

次のクエリで使用します。

SELECT get_utmzone(ST_GeomFromText('POINT( -5.86424016952515 36.5277099609375)',4326));

結果は32630

于 2015-09-28T12:43:41.937 に答える
1

まず、OpenGIS WKT Point(x,y) yours POINT(36.5277099609375 -5.86424016952515) の次のドキュメントは赤道の南にあるため、29S(EPSG:32729) と 30S(EPSG:32730) を使用する必要があります。

于 2015-09-28T12:42:01.537 に答える
0

理由はPOINT(36.5277099609375 -5.86424016952515)ではなくPOINT(-5.86424016952515 36.5277099609375)、経度と緯度がシステムに依存するためです。通常、X は経度、Y は緯度ですが、Google マップでは X が緯度、Y が経度です。

于 2015-09-28T12:43:08.080 に答える