none
DbGeography performant nutzen RRS feed

  • Frage

  • Hallo zusammen,

    ich habe da eine Frage zu dem Typ DbGeography. Ich habe gesehen, dass mit diesem Datentyp auch interessante Methoden zur Verfügung stehen wie z.B. Distance().

    Ich möchte eine Datenbank aufbauen mit mehreren Millionen Datensätzen verteilt mit Koordinaten in ganz Deutschland.

    Im nächsten Schritt möchte ich die Datensätze eingrenzen z.B. anzeigen aller Datenpunkte in einem Radius von 50km um Dortmund herum.

    Zunächst müsse bei alle Datensätzen die Entfernung zu dem Punkt in Dortmund berechnet werden und im nächsten Schritt alle Anzeigen wo <=50km entfernt sind. Nicht schön! Die Abfrage kann doch nicht wirklich performant sein oder?

    Eher vorstellen könnte ich mir, dass man die Latitude und Longitude Properties verwendet und damit ein Quadrat über die Schnittmenge legt und auf diese Schnittmenge dann die Distance() Methode aufrufen und alle Datensätze anzeigen <=50km.

    Das wäre mein favorisierter Ansatz bei solch einer Abfrage.

    Was sagen die Experten dazu?

    Gruß
    David

    Montag, 15. Mai 2017 14:17

Antworten

Alle Antworten

  • Hallo David,

    Für Versionen vor .NET 4.5 kannst Du in Entity Framework räumliche Funktionen nutzen, aber es ist anspruchsvoll, da man die DbContext-Funktion nicht direkt verwenden kann, um die Standortdaten zu manipulieren. In Entity Framework 5.0, das auf .NET 4.5 ausgeführt wird, fügt Microsoft Unterstützung für räumliche Typen hinzu. Hier verwendet die STGeomFromText-Funktion Geographie-Daten. Sie akzeptiert eine Zeichenfolge, die auf ein geometrisches Element verweist, zum Beispiel ein Punkt, eine Linie, ein Pfad oder ein Polygon u. a. In folgendem Thread findest Du die Beschreibung von grundlegenden Geographie-Funktionen, die sich mit einzelnen Standort- und Distanzberechnungen befassen, die wahrscheinlich das häufigste Nutzungsszenario sind:
    Basic Spatial Data with SQL Server and Entity Framework 5.0

    Gruß,

    Ivan Dragov


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Dienstag, 16. Mai 2017 13:26
    Administrator
  • Hallo David,

    der SQL Server verfügt auch über die Möglichkeit eine "Spatial Index" auf Geodaten Felder anzulegen, um solche Abfragen zu beschleunigen, siehe Übersicht über räumliche Indizierung


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Dienstag, 16. Mai 2017 16:07
  • Super!

    Danke für eure Antworten! Das bringt mich erstmal weiter!

    Viele Grüße
    David

    Dienstag, 16. Mai 2017 20:55
  • Olaf, hast du einen Ansatz wie man den Index mit EF und Code First setzen kann? Ich habe leider nichts gefunden außer einen manuellen SQL Befehl nach Add-Migrations zu platzieren.

    Herzlichen Dank!

    Gruß
    David

    Mittwoch, 17. Mai 2017 10:26
  • Ich verwende nie Code First, von daher weiß ich es nicht; hier hat jemand auch den Migration Ansatz genutzt: http://stackoverflow.com/questions/24750207/how-to-create-spatial-index-using-ef-6-1-fluent-api

    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Mittwoch, 17. Mai 2017 11:17