2016-03-21 6 views
1

sagen, dass ich folgende Daten in der Tabelle haben addresses:SQL Server - Abfrage von Geometriedaten

physicalState physicalPostalCode geometry 
------------------------------------------------------------------------------  
    PA    15340   0xE6100000010CAC1C5A643B1354C02D431CEBE2264440 
    OK    74576   0xE6100000010C7DD0B359F50158C079E9263108544140 
    WV    26033   0xE6100000010CE8D9ACFA5C2554C0273108AC1CEA4340 
    WV    26033   0xE6100000010C36AB3E575B2554C0C3D32B6519EA4340 

Ich möchte

select * 
from addresses 
where geometry = GEOMETRY::STPointFromText('POINT (40.3038 -80.3005)', 4326) 

es sehr schwierig zu finden, um dies herauszufinden ...

+0

Vielen Dank für die Formatierung der Frage @marc_s! Ich konnte das auch nicht herausfinden .... –

+0

Diese Koordinaten und die Tatsache, dass Sie auf Dinge wie Postleitzahlen verweisen, deutet darauf hin, dass Sie den Geografie-Datentyp lieber als Geometrie verwenden sollten ... –

+0

@BenThul Neugierig, warum das? ist. Kannst du es ausarbeiten? –

Antwort

2

Verwenden Sie die Methode [STContains] wie diese Bedingung:

geometry.STContains(GEOMETRY::STPointFromText('POINT (40.3038 -80.3005)', 4326)) 
+0

@marc_s Obwohl ich möchte, dass Adam Silenko eine Anerkennung für seine Antwort erhält, möchte ich den Text meiner Antwort als "Antwort" markieren, da er mehrere Beispiele für andere enthält, die auf dasselbe Problem stoßen könnten. Wie erreiche ich das, aber gebe Adam immer noch den richtigen Kredit? –

+0

@FernandoVega: Sie sollten ** Adams Antwort (wenn Sie nicht bereits haben) ** upvote - aber am Ende können Sie nur markieren * eine * Antwort als die "Lösung"/akzeptierte Antwort - entweder Adams oder Ihre eigenen. .. –

0

OKIE! Ich habe das herausgefunden ... Eine Sache, die es wert ist, zu notieren, die x/y-Koordinaten wurden umgedreht. Das half, die Dinge zu vereiteln. ich Idiot.

So oder so, das, was um in der Lage ist, die Datenbank durch spezifische Punkte abfragen:

select * from addresses 
WHERE geometry.ToString() = 'POINT (-80.3005 40.3038)' 

Auch @ Adam Silenko, seine Lösung funktioniert auch als solche gutzuschreiben:

select * 
from addresses 
where geometry.STContains(GEOMETRY::STPointFromText('POINT (-80.3005 40.3038)', 4326)) = 1 

Vielen Dank!

+0

Um klar zu sein, was Sie tun: Wenn Sie die ToString() -Methode aufrufen, arbeiten Sie jetzt mit einer Zeichenfolge und nicht mit einem geografischen Datentyp. Ihre Abfrage konvertiert die Punktgeometrie in eine Zeichenfolge und vergleicht sie dann mit der von Ihnen angegebenen Zeichenfolge, z. B. "Point (-80.3005 40.3038)". Was @AdamSilenko vorgeschlagen hat, war zu sehen, ob die Geometrie, die von dieser Zeichenkette dargestellt wurde, in einer der Geometrien in der Adresstabelle enthalten war. Das sind verschiedene Dinge. Um nach einem 1: 1-Geometrienvergleich zu suchen, sollten Sie die Methode .STEquals() verwenden. – hcaelxxam

+0

@hcaelxxam danke für den zusätzlichen Eingang! Ich verstehe definitiv das Konzept und für diese besondere Übung, eine der Methoden (ToString, STContains, STEquals) waren ausreichend, um die Anforderung zu erfüllen. Sehr gut, dass Sie dies in der Post für den Informationswert enthalten haben !! Danke Ihnen allen für Ihre Unterstützung! -Prost –