Jestem nowy w SQL Server 2008 i mam nadzieję, że zrozumiesz moje pytanie / potrzeb.
Dlatego mam tabelę, która zawiera 3 pola (nazwa, szerokość i długość) w mojej bazie danych (przestrzenne). Chcę utworzyć kolumnę geometrii / geografii na podstawie tych pól (Lat i Długi), ale niestety bez sukcesu.
Moje pytanie brzmi: Jak mogę to zrobić?
Komentarze
- sql-server-helper.com/sql-server-2008/…
Odpowiedź
Możesz dodać taką kolumnę obliczeniową
alter table yourTable add geographyColumn as geography::STGeomFromText("POINT("+convert(varchar(20),Long)+" "+convert(varchar(20),Lat)+")",4326)
Dodałem konwersję z lng lub lat, ponieważ zapisuję długie i długie jako liczby.
Komentarze
- Dziękuję za odpowiedzi, udało mi się aby rozwiązać mój problem za pomocą tego wiersza: UPDATE yourdatabase SET geometry_column = geometry :: P oint ([ColX], [ColY], SRID)
- Czy jest możliwe utworzenie wyzwalacza? Tak jak wtedy, gdy wypełnisz swoje pola (kolumny X i Y) informacjami, wspomniany skrypt zostanie uruchomiony.
Odpowiedź
Wygląda na to, że chcesz STGeomFromText()
lub STPointFromText()
Metoda SQL:
DECLARE @g geography; SET @g = geography::STGeomFromText("POINT(-122.34900 47.65100)", 4326); SELECT @g.ToString();
lub
DECLARE @g geography; SET @g = geography::STPointFromText("POINT(-122.34900 47.65100)", 4326); SELECT @g.ToString();
Utwórz pole Geometry
lub Geography
, a następnie użyj języka SQL, aby wypełnić to pole przy użyciu wartości lat / lon.
Komentarze
- Jaka byłaby różnica w zastosowaniu zamiast tego następującej metody …
DECLARE @g geometry; SET @g = geometry::STPointFromText('POINT (100 100)', 0);
- @awesomo – Tak, właściwie możesz go użyć, jeśli chcesz.
Odpowiedź
SQL Server 2012
Możesz to zrobić w ten sposób,
SELECT geography::Point(lat, long, 4326)
Aby uzyskać więcej informacji, zobacz mój post dotyczący administratorów baz danych, „SQL Server Konstruktor punktów czy wersja ST_Point (x, y)? „
Komentarze
- Jeśli konstruktor dla
Point
przyjmuje argumenty x, y, więc będziesz chciał zmienić kolejność w następujący sposób:geography::Point(long, lat, 4326)
. Długość geograficzna tox
, a szerokość toy
.
Odpowiedź
Jeśli zaokrąglenie oryginalnych wartości Long / Lat występuje podczas używania instrukcji CONVERT(VARCHAR,
.
Spróbuj użyć:
GeoData = geometry:: STGeomFromText("POINT(" + CAST(CAST(X AS decimal(13, 2)) AS varchar) + " " + CAST(CAST(Y AS decimal(13, 2)) AS varchar) + ")", 4326)
Komentarze
- Obawiam się używania tej metody, ponieważ wiąże się to z utratą precyzji lokalizacji.