2013-04-24 2 views
3

Здравствуйте, у меня есть следующий код в SQL Server, поэтому, если я хочу, чтобы перевычисления sTArea из @geog не удается, и с @geom успеха ?, как я могу преобразовать этот многоугольник от геометрии до географического типа данных, чтобы получить STArea ?, спасибо.Преобразование географии геометрии SQL Server 2008R2

DECLARE @geom geometry; 
SET @geom = geometry::STGeomFromText('POLYGON ((-99.213546752929688 19.448402404785156, -99.2157974243164 19.449802398681641, -99.2127456665039 19.450002670288086, -99.213546752929688 19.448402404785156))', 4326); 
select @geom.STArea(); 

DECLARE @geog geography; 
SET @geog = geography::STGeomFromText('POLYGON ((-99.213546752929688 19.448402404785156, -99.2157974243164 19.449802398681641, -99.2127456665039 19.450002670288086, -99.213546752929688 19.448402404785156))', 4326); 
select @geog.STArea(); 

ответ

6

Я пошарил немного, и этот ответ How can I convert Geometry data into a Geography data in MS SQL Server 2008?, которые более или менее просто указывает на http://blogs.msdn.com/b/edkatibah/archive/2008/08/19/working-with-invalid-data-and-the-sql-server-2008-geography-data-type-part-1b.aspx приводит меня к разумному объяснению и рабочего кода.

Ключ: вы должны убедиться, что геометрию можно перенести в правильную географию.

код (который, конечно, может иметь некоторые операции объединены, но сломаны здесь для ясности.)

DECLARE @geog GEOGRAPHY; 
DECLARE @geom GEOMETRY; 

SET @geom = GEOMETRY::STGeomFromText('POLYGON ((-99.213546752929688 19.448402404785156, -99.2157974243164 19.449802398681641, -99.2127456665039 19.450002670288086, -99.213546752929688 19.448402404785156))', 4326); 
SET @geom = @geom.MakeValid() --Force to valid geometry 
SET @geom = @geom.STUnion(@geom.STStartPoint()); --Forces the correct the geometry ring orientation 
SET @geog = GEOGRAPHY::STGeomFromText(@geom.STAsText(),4326) 

SELECT @geog.STArea(); 

И для тех, кто не будет читать весь путь через блоге Spatial Эда один важный подскажите, пожалуйста, помните, что этот подход наивен, поскольку он не вмещает несколько потенциальных краевых условий. Тем не менее, этот подход должен работать во многих случаях ».

+0

Я бы ожидал (но не знаю, что факт), что преобразование через WKB было бы немного более эффективным, чем через WKT. –

+0

Life saver чувак! Я использовал это в своем коде C# с некоторой адаптацией, и он работает как шарм –

Смежные вопросы