Vairāk

Vai atrast īsāko ceļu starp punktiem, izvairoties no formas faila?

Vai atrast īsāko ceļu starp punktiem, izvairoties no formas faila?


Esmu vidēja līmeņa python izstrādātājs ar ļoti ierobežotu ĢIS pieredzi. Man ir kuģa platuma/garuma saraksts jūrā. Man ir jāapvieno tās polilīnijā, izmantojot īsāko attālumu starp tām, lai izsekotu ceļu, kuram seko kuģis. Tomēr ceļš nevar iet pāri sauszemei ​​(kurai man ir formas fails). Kā es varu to izdarīt? Es izmantoju Python 2.7.

Pašlaik es neizmantoju nevienu ĢIS programmatūru un ceru, ka varēšu izpildīt uzdevumu, izmantojot python moduļus, piemēram, matplotlib un scipy.


Tas izklausās kā jautra problēma. Es apsvērtu:

  1. Izlasiet zemes robežas shp failu, izmantojot vienu no šīm receptēm: Kā instalēt Fiona, lai lasītu Shapefile atribūtus, izmantojot OSGeo4W ?. Droši vien būtu labi to izlasīt Shapely ģeometrijā. Man patīk izmantot ogr, lai lasītu formas failus:
importēt ogr importēt formālu draiveri = ogr.GetDriverByName ('ESRI Shapefile') dataSource = driver.Open ('landboundary.shp', 0) layer = dataSource.GetLayer () feature = layer [0] # first border border geom = feature.GetGeometryRef () shapely.geometry.base.geom_from_wkt (geom.ExportToWkt ())
  1. Izmantojiet NetworkX, lai izveidotu visu savu garo kuģu koordinātu tīklu, bet nesavienojiet koordinātas, kuru taisnā līnija savienojas ar sauszemes robežu. Šeit ir piemērs ģeometriju krustojumam: Shapely LineString un Polygon krustojas ?.

  2. Pēc tam aprēķiniet lētāko ceļu, izmantojot NetworkX, un izmaksas ir attālums. LCP nešķērsos sauszemi, jo šie mezgli nav savienoti.

Turklāt tikai formālas ģeometrijas tiek pārveidotas par WKT (labi zināms teksts, kas ir uz tekstu balstīts formāts), piemēram,myShapelyGeometry.wkt, kuru ir ļoti viegli un intuitīvi parsēt un izmantot, kā vēlaties.

Rediģēt: tikai papildu informācija: Lai aprēķinātu attālumu starp diviem latiem, varat izmantot pyproj:

importēt pyproj geod = pyproj.Geod (ellps = 'WGS84') _, _, distance = geod.inv (long_start, lat_start, long_end, lat_end)

Varat arī palaist networkx grafiku, piemēram:

importēt networkx diagrammu = networkx.Graph () graph.add_edge ('coord_a', 'coord_b', weight = distance) # tāpat pievienot papildu malas start_node = find_closest_node (diagramma, lat_start, long_start) end_node = atrast_closest_node (diagramma, lat_end , long_end) ship_path = networkx.shortest_path (grafiks, sākuma_mezgls, beigu_mezgls)