Ich habe eine Rails-App, die rgeo 0.3.19 mit proj4-Unterstützung verwendet und eine Verbindung zu einer PostGIS 1.5-Datenbank mit dem rgeo-activecord 0.4.5 gem. Herstellt.RGeo Projected Buffer Polygon zu klein
Meine App hat ein Modell namens Region, das einen geographischen Punkt, einen Radius und eine Polygonform enthält. Wenn eine neue Region gespeichert werden soll, verwendet sie die Pufferfunktion der Region, um ein Polygon mit dem Radius und dem geografischen Punkt zu erstellen.
Hier ist die geofactory die
für die Region Modell verwendet wirdGEOFACTORY = RGeo::Geographic.projected_factory(:buffer_resolution => 8, :projection_proj4 => '+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m [email protected] +wktext +no_defs', :projection_srid => 3857)
Die projection_srid ich verwende, ist, dass von Apple und Google Mercator-Projektion 3857. Das Problem bildet, ist, dass der Puffer, der erstellt wird ist nicht die gleiche Größe wie die, die ich entweder in Apple Maps oder Google Maps zeichne. Zum Beispiel, wenn ich die in MapKit Funktion MKCircle gebaut verwenden
[MKCircle circleWithCenterCoordinate:self.coordinate radius:50];
Der Kreis wird so zeichnen und überlagert.
Aber wenn ich die Koordinaten nehme, die von der Pufferfunktion erzeugt wurden, die die Polygonform in der Datenbank bilden und sie auf Google Maps zeichne, bekomme ich diese.
Wie Sie sehen können, das Polygon, das die gleiche Projektionssystem wurde unter Verwendung kleiner ist als es sein sollte. Dieses Problem wächst exponentiell aufgrund der Größe des definierten Radius außer Kontrolle. Ich habe auch versucht, die simple_mercator factory wie in RGeo definiert zu verwenden, die die gleichen Ergebnisse lieferte.
Hoffentlich hat jemand einen Einblick, warum, wenn ein geographischer Längen- und Breitengrad projiziert wird, ein falsch bemessenes Polygon entsteht.
Danke für die Bearbeitung, MobileOverlord. Ich habe vergessen, dass es in Ruby keine Sekantenfunktion gab. Das ist, was ich bekomme, um Code zu veröffentlichen, ohne es zuerst zu testen ... :-) –