2012-09-05 4 views
0

Je suis très nouveau dans le domaine spatial de SQL Server et j'ai besoin d'aide. J'ai une application d'organisation de waypoint et j'essaie de générer des requêtes qui suivent le principe de trouver des points de cheminement qui font partie de polygones géographiques comme les lacs, rivières, etc. J'ai préchargé mes tables avec des données que j'ai téléchargées. J'ai utilisé shape2sql.exe pour charger des fichiers de formes dans les tables de base de données appropriées.Requêtes spatiales SQL Server 2008 R2

Les tableaux sont les suivants:
Table eau - id, nom, geog (type de données géographiques)
tableau État - id, state_name, state_abbr, geog (type de données géographiques)
Table Comté - id, nom, state_name, geog (type de données géographiques)
table Waypoint - id, nom, latitude, longitude, waterid

Comment puis-je écrire des requêtes sur ces tables pour revenir des choses comme:
- tous les points de passage dans 'michigan'
- tous les waypoints sur 'bass lake' dans 'montcalm' comté de 'michigan' (il y a plusieurs bass bass au michigan et le pays d'où la partie county/state)
- assigne automatiquement la colonne water id de la table de waypoint en "traitant" un groupe de waypoints et en trouvant quel lac ils ont réellement appartiennent à
- etc.

Merci!

Learned jusqu'à présent:
select geog.ToString() comme points, geog.STArea() comme zone, geog.STLength() comme Longueur de l'eau où nom comme '%% du lac basse' et STATE = '0'

retournera le record pour Bass Lake et le polygone avec les coordonnées réelles du lac.
polygonal ((-87,670498549804691 46,304831340698243, -87,670543549804691 46,307117340698241, -87,676573549804687 46,313480340698241, -87,68120854980468 46,314821340698245, -87,685168549804686 46,315703340698242, -87,6877605498047 46,313390340698241, -87,685051549804683 46,308827340698244, -87,682360549804685 46,305650340698243, -87,677734549804683 46,304768340698246, -87,674440549804686 46,304336340698242, -87,670498549804691 46,304831340698243)) 1022083.96662664 4027,52433709888

Répondre

0

Ok - apprentissage que je vais donc voici quelques réponses à mes propres questions pour toute personne qui voudrait savoir.

Voici une requête pour trouver différents points de passage avec des conditions dans la clause where:
SELECT * FROM WaypointTable wp
REJOIGNEZ Watertable w
SUR wp.geogcolumn.STIntersects (w.geogcolumn) = 1
où w .name LIKE '% bass lake%'
ET w.état = 'mi';

Voici une requête pour l'attribution id d'eau de points de cheminement en fonction de l'endroit où ils Taillefine ':
MISE À JOUR WaypointTable wp
SET WaterID = (
ID SELECT
DE Watertable
OU geogcolumns.STIntersects (wp. geogcolumn) = 1
);

Ces deux requêtes fonctionnent extrêmement bien et rapidement! Aimer!

0

tir de la hanche, ici, mais peut-être comme ceci:

UPDATE waypoints 
SET waypoints.WaterId = water.Id 
FROM dbo.Waypoints AS waypoints LEFT JOIN 
    dbo.Water AS water ON geography::Point(waypoints.Lat, waypoints.Lon, 4326).STIntersects(water.geog) 

devrait fixer les waterId sur la table wapoints à l'un des ids d'eau correspondant, de la nappe phréatique.

Cela devrait vous obtenir tous les points de passage sur BASS LAKE

SELECT waypoints.* 
FROM dbo.Waypoints as waypoints INNER JOIN 
    dbo.Water AS water ON geography::Point(waypoints.Lat, waypoints.Lon, 4326).STIntersects(water.geog) = 1 
WHERE water.Name = 'BASS_LAKE' -- OR WHATEVER 
+1

Est-ce que le point géographique a besoin de longitude, puis de latitude et de srid? obtenir une sorte d'erreur sur la longitude devant être entre -90 et 90 ...... –