geometry -> geography 変換 なのですが、関数が用意されているわけではないので、
自分で作成する必要があります。
基本的に平面座標を球体に変換しているので、
いろいろ制約があり、変換できないケースもあります。
変換の方法は
2通りの方法があります。
(1)Well-Known Text (WKT) 表現 を用いて、 Geometry 型データを、 Geography に変換
(2)Well-Known Binary (WKB) 表現 を用いて、 Geometry 型データを、 Geography に変換
例
サンプルテーブル
CREATE TABLE Heimen (id int, geom geometry);
CREATE TABLE Kyuu (id int, geog geography);
(1) のサンプル
INSERT INTO Kyuu
SELECT
Heimen.id,
GEOGRAPHY::STGeomFromText(Heimen.geom.STAsText(),4326)
FROM Heimen;
(2) のサンプル
INSERT INTO Kyuu
SELECT
Heimen.id,
GEOGRAPHY::STGeomFromWKB(Heimen.geom.STAsBinary(),4326)
FROM Heimen;
なお4326は、SRID(spatial reference identifier)です。
SRIDが異なる場合、空間データを扱うメソッドはNULLが返ってきます。
それぞれの肝になるメソッドの説明
STAsText() : geometry インスタンスのOpen Geospatial Consortium (OGC) の
Well-Known Text (WKT) 表現を返します
STGeomFromText() : WKT 表現を基に geography インスタンスを返す
STAsBinary() : geometry インスタンスの Open Geospatial Consortium (OGC)
Well-Known Binary (WKB) 表現を返します
STGeomFromWKB() : WKB 表現を基に geography インスタンスを返す
エラーサンプル
たとえば、このようなエラーになることがあります。
ユーザー定義のルーチンまたは集計 "geography" を実行中に .NET Framework エラーが発生しました:
System.ArgumentException: 24200: The specified input does not represent a valid geography instance.
System.ArgumentException:
at Microsoft.SqlServer.Types.SqlGeography.ConstructGeographyFromUserInput(GeoData g, Int32 srid)
at Microsoft.SqlServer.Types.SqlGeography.GeographyFromBinary(OpenGisType type, SqlBytes binary, Int32 srid)
at Microsoft.SqlServer.Types.SqlGeography.STGeomFromWKB(SqlBytes wkbGeometry, Int32 srid)
。
対策が分かりづらいですが、geographyをあらわす線の書き方に問題があって、時計回りにつながってないと
だめっぽいですが、その部分で問題があった場合このエラーになります。
あとは、線がクロスしてるような図形もだめっぽいです。
対策としては、元のGeometryをいじって、こうならないようにする・・・くらいですかね。。