Mehr

Wie teile ich die epsg 4326-Linienfolge in Teile auf, die aus einer bestimmten Länge in Metern in Python bestehen?

Wie teile ich die epsg 4326-Linienfolge in Teile auf, die aus einer bestimmten Länge in Metern in Python bestehen?


Ich möchte die Länge von Linienfolgen (epsg:4326) in Metern statt in Grad wissen. Ich weiß, dass ich dafür proj4 verwenden kann.

Hier ist mein Code, wenn Sie interessiert sind.

project = partiell( pyproj.transform, pyproj.Proj(init='EPSG:4326'), pyproj.Proj(init='EPSG:3395') ) project2 = partiell( pyproj.transform, pyproj.Proj(init='EPSG :3395'), pyproj.Proj(init='EPSG:4326') ) def distance_in_meters(linestring): return transform(project, linestring).length def interpolate(distanz, linestring): current_ratio = 0 Punkte = [] step = distance / distance_in_meters(linestring) while current_ratio < 1: point = linestring.interpolate(current_ratio, normalized=True) current_ratio += step points.append(point) return points distance_between_points = 249.67 total_distance_in_meters = distance_between_points * 5 class TestInterpolate(TestCase): def test_interpolate(self): with open("linestring.json", 'r') as f: s = shape(json.load(f)) points = interpolate(10, s) l = LineString(points) self.assertEqual( distance_in_meters(l), total_distance_in_meters)

Und hier ist die Linienfolge, die ich für Tests verwende.

{ "type": "LineString", "coordinates": [ [ 37.6232398, 55.7615482 ], [ 37.6262633, 55.7606701 ], [ 37.6232398, 55.7615482 ], [ 37.6262633, 55.7606701 ], [ 37.6232398, 55.7615482 ], [ 37.6262633, [ 37.6232398, 55.7615482 ], [ 37.6232398, 55.7615482 ], [ 37.6260133 ] }

Was ich getan habe, ist, dass ich Koordinaten von zwei Punkten aus Google Maps genommen und die Entfernung zwischen ihnen auch in Google Maps gemessen habe. Dann habe ich es mehrmals dupliziert, um einen Pfad zu erstellen, der 5-mal hin und her schwingt.

Und das Ergebnis des Tests ist

1864.394777794176 != 1248.35

Was ziemlich weit von der tatsächlichen Entfernung der Linienfolge entfernt ist. Ich nehme an, der Grund ist - ich verwende nicht das richtige CRS für die Meterprojektion.


Keine Antwort auf Ihre Frage, sondern eine Referenzmethode, um Ihre Ergebnisse zu vergleichen mit:

  • Lesen Sie dieses PostGIS-Dokument http://postgis.net/docs/ST_Length.html
  • Nehmen Sie das Geography-Beispiel "Return length of WGS 84 geography line" und fügen Sie Ihre Zeilenfolge in die Abfrage ein
SELECT ST_Length(the_geog) Als length_spheroid, ST_Length(the_geog,false) Als length_sphere FROM (SELECT ST_GeographyFromText( 'SRID=4326;LINESTRING ( 37.6232398 55.7615482, 37.6262633 55.7606701, 37.6232398 the_7.6232398 55.76.363.82.37.6 ) Als foo;

Überprüfen Sie die Ergebnisse:

Länge_Sphäroid 1067.52749423872 Länge_Kugel 1064.36864138641

Ich habe die Daten auch mit OpenJUMP in EPSG:32637 umgewandelt und die Entfernung gemessen: 1067.1980.

Fazit: Die Entfernung, die Sie von Google Maps gemessen haben, ist keine gute Referenz. Sind Sie sicher, dass Sie diese Distanz fünf- und nicht sechsmal gemessen haben? Mit dem Fünffachen würde es 1040.291 ergeben, was den Ergebnissen mit EPSG:32637 und mit Geographie viel näher kommt.