يجد نظم المعلومات الجغرافية نقاط (لاتس طويلة) الواردة من قبل مضلع أعرب عنها كمجموعة من لاتس طويلة

StackOverflow https://stackoverflow.com/questions/788469

  •  16-09-2019
  •  | 
  •  

سؤال

أحاول إيجاد جميع عناصر البيانات التي تحتوي على وقت طويل / لاتس موجودة من قبل مضلع تتكون من مجموعة من لاتس طويلة يمكن أن تكون نقاط كثيرة. أعلم أنه يمكنك القيام بهذا النوع من الأشياء مع أنواع البيانات الجيولوجية الجديدة في SQL 2008 ولكني أستخدم SQL 2005 و C #. هل سيتم القيام بذلك بشكل أفضل في نهاية DB أو في C #.

شكرًا.

هل كانت مفيدة؟

المحلول

لدي بعض التعليمات البرمجية المكتوبة ل SQL2000 للقيام بذلك. يستخدم طريقة "الزاوية" لتحديد ما إذا كانت النقطة تكمن داخل مضلع.

أولا، وظيفة Getangle Defined Defined:

ALTER Function [dbo].[GetAngle](
@Ax Decimal(8,5), 
@Ay Decimal(8,5), 
@Bx Decimal(8,5), 
@By Decimal(8,5), 
@Cx Decimal(8,5), 
@Cy Decimal(8,5))

إرجاع تعويم كما تبدأ

Declare @dot_product Float
Declare @cross_product Float

Declare @BAx Decimal(8,5)
Declare @BAy Decimal(8,5)
Declare @BCx Decimal(8,5)
Declare @BCy Decimal(8,5)

--' Get the vectors' coordinates.
Set @BAx = Sign(@Ax - @Bx) * dbo.CalculateDistance(@Ax, @Ay, @Bx, @Ay)
Set @BAy = Sign(@Ay - @By) * dbo.CalculateDistance(@Ax, @Ay, @Ax, @By)
Set @BCx = Sign(@Cx - @Bx) * dbo.CalculateDistance(@Cx, @Cy, @Bx, @Cy)
Set @BCy = Sign(@Cy - @By) * dbo.CalculateDistance(@Cx, @Cy, @Cx, @By)

--' Calculate the dot product.
Set @dot_product = @BAx * @BCx + @BAy * @BCy

--' Calculate the Z coordinate of the cross product.
Set @cross_product = @BAx * @BCy - @BAy * @BCx

--' Calculate the angle.
return ATn2(@cross_product, @dot_product)

نهاية


بعد ذلك، افترض أن هناك متغير جدول من أزواج خطوط الطول / خط الطول ورقم التسلسل (يشير إلى الترتيب الذي حدد فيه أزواج Lat / Long Polegon). من المهم أن تكون النقطة الأولى في هذا الجدول هي نفس النقطة الأخيرة في الجدول.

أيضا، لدي العديد من المتغيرات ل MIN و MAX Latitude & Londitude. هذا يخلق بفعالية مربع محيط حتى أتمكن من القضاء بسرعة على النقاط غير داخل منطقة مستطيلة يرتبط المضلع.

Select  Address.AddressId
From    @Temp As A
        Inner Join @Temp As B
            On A.SequenceNumber = B.SequenceNumber - 1
        Inner Join Address
            On Address.XCoord Between @MinLongitude And @MaxLongitude
            And Address.YCoord Between @MinLatitude And @MaxLatitude
Group By Address.AddressId
Having Abs(Sum(dbo.GetAngle(A.Longitude, A.Latitude, Address.XCoord, Address.YCoord, B.Longitude, B.Latitude))) > 3.14

نصائح أخرى

يبدو وكأنه شيء يعطي صداعا إذا فعلت في T-SQL (وهو كل شيء أكثر أو أقل كل شيء؟). بالطبع يعتمد ذلك على تعقيد المضلعات والطريقة التي توجد بها عناصر البيانات ولكن بشكل عام قد يكون النهج الأسهل والفعال بشكل معتدل هو القيام ببعض الحسابات الأولية في C # التي تحد من عناصر البيانات بطريقة خشنة للغاية. لذلك شيء مثل ما يلي.

  1. احسب الحدود الخشنة من المضلع في ج #.
  2. احصل على كل شيء داخل هذه الحدود من SQL Server.
  3. هل تصفية الدقة النهائية في C #.

يعتمد أداء بالطبع على مدى جودة يمكنك حساب الحدود الأولية. سأبدأ بمستطيل محيط بسيط أولا ومعرفة ما إذا كان الأداء كافيا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top