متدهای STIsValid، IsValidDetailed و MakeValid
تعیین اعتبار اشیاء مکانی در SQL Server 2012 تا حد زیادی بهبود یافته است. متد STIsValid به یک شی مکانی را بررسی کرده و مقدار 1 (درست ) یا 0 (غلط) برمی گرداند که نشان می دهد اگر شی نمایشگر یک شکل معتبر است یا خیر. اگر شی نامعتبر باشد، متد جدید IsValidDetailed به دلیل عدم اعتبار آن را توضیح می دهد. کد زیر را ببینید:
1 2 3 4 5 6 7 |
DECLARE @line geometry = 'LINESTRING(1 1, 2 2, 3 2, 2 2)' SELECT IsValid = @line.STIsValid(), Details = @line.IsValidDetailed() |
این رشته خط نامعتبر است زیرا نقطه (2 2) تکرار شده است، که منجر به خطای “لبه ها با هم تداخل دارند،” می شود که خروجی IsValidDetailed آن را برمیگرداند:
1 2 3 4 5 |
IsValid Details ------- ------------------------------------------------------------------- 0 24413: Not valid because of two overlapping edges in curve (1). |
SQL سرور 2012 تحمل بیشتری برای اشیا مکانی نامعتبر نسبت به نسخه های قبلی دارد. برای مثال، شما هم اکنون می توانید انجام عملیات متریک مانند STLength را برروی اشیا نامعتبر نیز انجام دهید، هر چند هنوز هم قادر نخواهید بود به انجام عملیات های دیگر مانند STBuffer را بر روی آنها اجرا کنید.
متد جدید MakeValid می تواند اشیا مکانی نامعتبر را تصحیح کرده و آن را معتبر سازد. البته، شکل کمی تغییر خواهد کرد، و هیچ تضمینی بر صحت و یا دقت تغییرات انجام شده وجود ندارد. کد زیر با استفاده از MakeValid به حذف قطعاتی که با هم تداخل دارند (که می تواند توسط ناهنجاریهای مانند آثار نادرست GPS ایجاد شده باشد( اقدام کرده و رشته خط نامعتبر به یک شی مکانی معتبر تبدیل می کند.
1 2 3 |
DECLARE @line geometry = 'LINESTRING(1 1, 2 2, 3 2, 2 2)' SELECT @line.MakeValid().ToString() AS Fixed |
رشته WKT بازگردانده شده توسط دستور SELECT رشته خط تصحیح شده را نشان می دهد:
1 2 3 4 5 |
Fixed ------------------------------------------------------------------- LINESTRING (3 2, 2 2, 1.0000000000000071 1.0000000000000036) |