2012-05-26 28 views
7

SQL Server kullanarak Linestring'den puan ayıklamak gerekiyor. Geometry.ToString() ile koordinatları görebileceğimi biliyorum ama yeni nokta geometrisine ihtiyacım var. Nasıl yapabilirim?Noktalara hizalama

cevap

1

Geometri veri türü hakkında hiçbir şey bilmiyorum, ancak documentation, STNumPoints kullanarak nesnenin puan sayısını aldığını ve sonra STPointN kullanarak tek tek noktaları aldığını söylüyor.

6

İşte LineString noktaları ayıklamak için nasıl biraz örnektir:

declare @LineString geography, 
     @loop  int 
declare @Points  table (Point geography) 

set @LineString = geography::Parse('LINESTRING(
     -22.8317451477051 -43.4041786193848,-22.8308925628662 -43.4045524597168,-22.8314971923828 -43.404727935791, 
     -22.833927154541 -43.4069404602051,-22.8267574310303 -43.4071388244629)') 

set @loop = @LineString.STNumPoints() 

while @loop > 0 
    begin 
    insert into @Points values(@LineString.STPointN(@loop)) 
    set @loop = @loop -1 
    end 

select Point.Lat as Lat, Point.Long as Long from @Points 

Ve pes etmeyin: T-SQL Mekansal Veri biraz zordur, ama işe yarar! Eğer SQL 2005+ kullanıyorsanız

12

, bir CTE ile yapıyor öneriyoruz:

DECLARE @GeometryToConvert GEOMETRY 
SET  @GeometryToConvert = 
    GEOMETRY::STGeomFromText('LINESTRING (-71.880713132200128 43.149953199689264, -71.88050339886712 43.149719933022993, -71.880331598867372 43.149278533023676, -71.88013753220099 43.147887799692512, -71.879965998867931 43.147531933026357, -71.879658998868422 43.147003933027179, -71.879539598868575 43.146660333027739, -71.879525332201979 43.145994399695439, -71.87959319886852 43.145452399696296, -71.879660598868384 43.14531113302985, -71.879915932201357 43.145025599696908, -71.879923198868028 43.1449217996971, -71.879885998868076 43.144850733030523, -71.879683932201715 43.144662333030851, -71.879601398868488 43.144565333030982, -71.879316798868956 43.144338333031328, -71.879092332202617 43.144019799698469, -71.8789277322029 43.143902533032019, -71.878747932203169 43.143911533031996, -71.878478132203554 43.14405779969843, -71.878328332203807 43.144066133031743, -71.878148732204068 43.144016599698489, -71.8772655988721 43.143174533033118, -71.876876198872708 43.142725133033821, -71.876801532206173 43.142654933033953, -71.876629398873092 43.142600733034044)', 4269) 
; 
WITH GeometryPoints(N, Point) AS 
( 
    SELECT 1, @GeometryToConvert.STPointN(1) 
    UNION ALL 
    SELECT N + 1, @GeometryToConvert.STPointN(N + 1) 
    FROM GeometryPoints GP 
    WHERE N < @GeometryToConvert.STNumPoints() 
) 

SELECT *, Point.STAsText() FROM GeometryPoints 

Metin

Text Results

Mekansal Sonuçlar - STBuffer (.0001)

Spatial Results (Buffered)

+0

Puanlarınızın nasıl görünmesini sağladınız? Puanları gösterdiğimde, ancak okunaklı değildir. –

+1

STBuffer() işlevini kullanma. Geometri veya Coğrafya http://technet.microsoft.com/en-us/library/bb933965.aspx –

+0

üzerinde kullanıp kullanmamanıza bağlı olarak ideal değer farklıdır. Evet, STBuffer (1) ile coğrafya kullanıyorum ve puanlar dikdörtgen Onları seninki gibi mükemmel çevreler nasıl yapabilirim? –