2016-03-26 16 views
0

Ich habe einen POI-Punkt von Interesse ausgewählt auf einer bestimmten Breite und Länge und ich möchte ein paar zufällige Punkt, die höchstens 50 Meter entfernt sind, sehr genau erzeugen. Ich möchte nicht über 50 Fuß gehen, aber ich möchte auch, dass der zufällige Punkt gleichmäßig auf die 50 Fuß verteilt wird.Erzeugen Sie Punkte auf einer Kugel innerhalb eines bestimmten Radius von einem Punkt aus

Hier ist, was ich bisher habe, sieht es ziemlich gut aus, aber es erzeugt Entfernungen, die zu weit weg sind.

Meine beste Vermutung ist bisher, dass viele meiner Annahmen auf Kreisen statt auf Kugeln basieren.

x0 = Longitude of POI 
y0 = Latitude of POI 
u = Uniformly random number between [0,1) 
v = Uniformly random number between [0,1) 

r = 50*0.3048/111,300 
r = maximum 50 foot radius distance new point is away from POI 
    0.3048 is to convert feet to meters 
    111,300 is to convert meters to degrees for earth 

θ (or t) = 2π*v 
θ (or t) = Uniformly random rotation around the polar axis 

w = r*sqrt(u) 
w = Non-uniformly random distance based on polar coordinate system 
    so points don’t clump near the center. 

Δy = w*sin(θ) 
Δy = New random delta change to latitude 
    standard w*sin(θ) for converting from polar to Cartesian coordinates 

y1 = y0+Δy 
y1 = New random latitude of new point 

Δx = w*cos(θ)/cos(y1*π/180) 
Δx = New random delta change to longitude 
    cos(y1*π/180) used to adjust for shrinking east west distances 
    as you move further away from the equator 

x1 = x0+Δx 
x1 = New random longitude of new point 

einfach etwas mehr Kontext hinzufügen, ich mache diese innerhalb von SQL Server einer WKID 4326 Geographie Koordinatensystem und meine Arbeit mit STDistance überprüfen.

+0

können Sie meine Formel verwenden ... [äquidistante Punkte auf der Kugel] (http://stackoverflow.com/a/25031737/2521214). Da Sie nicht den ganzen Globus abdecken, ignorieren Sie die "Ceil" -Rundung, um die Punkte wirklich äquidistant zu halten. – Spektre

Antwort

0

Nur die Lösung gefunden, es war nichts falsch in meiner Mathematik, es war ein Fehler beim Konvertieren eines Float zu einem VARCHAR in SQL-Server, ich werde meinen festen SQL-Server-Code unten enthalten. Bevor wo ich:

CONVERT(VARCHAR(50),xxx,3) 

Ich hatte:

CAST(xxx AS VARCHAR(50)) 

Die default wenn ein Schwimmer varchar ist nur 6 signifikante Stellen Umwandlung, so musste ich ein Format Argument zu übergeben. Eine Sache, die sehr merkwürdig ist, ist CAST soll nicht abgeschnitten werden, aber auf jeden Fall hat es !! Vielleicht ist dies ein Fehler in SQL Server 2016 RC0.

WITH 
LoopTable AS (
    SELECT 1 AS i 
    UNION ALL 
    SELECT i + 1 
    FROM LoopTable 
    WHERE 
    (i + 1) <= 100000 
), 
InitialPOI AS (
    SELECT geography::STPointFromText('POINT(-81.2545 44.1244)',4326) POI 
    FROM LoopTable 
) 
SELECT NewPoint.Lat NewLat, NewPoint.Long NewLong, Distance 
FROM (
    SELECT POI, NewPoint, POI.STDistance(NewPoint)/0.3048 Distance 
    FROM (
     SELECT POI, geography::STPointFromText('POINT('+CONVERT(VARCHAR(50),POI.Long+x,3)+' '+CONVERT(VARCHAR(50),POI.Lat+y,3)+')',4326) NewPoint 
     FROM (
      SELECT POI, w*COS(t)/COS(POI.Lat*PI()/180) x, w*SIN(t) y 
      FROM (
       SELECT POI, 25*0.3048/111300*SQRT(RAND(CHECKSUM(NEWID()))) w, 2*PI()*RAND(CHECKSUM(NEWID())) t 
       FROM InitialPOI 
      ) i1 
     ) i2 
    ) i3 
) i4 
OPTION (MAXRECURSION 0) 
+0

Dies ist immer noch keine perfekte Lösung, ich bekomme Punkte, die bis zu 25,05 Meter entfernt sind, es ist nahe genug für mich, aber ich würde gerne bekommen ein perfekter Algorithmus. –

Verwandte Themen