Как найти ближайшую точку строки строки в заданном месте - rgeo - PullRequest
1 голос
/ 23 мая 2019

Мои координаты точки находятся в географических системах координат. Они в памяти. Мне нужно найти ближайшую точку в строке строки к данной точке, используя библиотеку RGeo из Ruby.

Мой сценарий заключается в том, что точки в googlemap отображаются в виде ломаной линии, как дорожное представление, а местоположение - это положение моего транспортного средства. Мне нужен кратчайший путь, чтобы добраться до дороги.

В PostGIS есть решения, но мои данные находятся в памяти, и я не хочу использовать Postgresql для этой цели.

Я проверяю самоцвет RGeo, но не смог найти никакой подсказки, связанной с этим.

[Изменено]

enter image description here

enter image description here

Ссылка: https://postgis.net/docs/ST_ClosestPoint.html

1 Ответ

1 голос
/ 23 мая 2019

Это подробно описано здесь: https://groups.google.com/forum/#!topic/rgeo-users/e1FgzpPISs8

# Create a Geos factory that uses the ffi interface
factory = RGeo::Geos.factory(:native_interface => :ffi)

# Create your polyline and point A using that ffi-backed factory.
# You can create the objects directly using the factory, or cast objects to the
# factory, whatever is the easiest way for you to get objects that are attached
# to the ffi factory.
polyline = factory.line_string( ... )
point = factory.point( ... )

# Objects that are attached to an ffi-geos factory provide access, via the
# fg_geom method, to low-level objects that understand the ffi-geos api.
# This is not really documented well, but it's a stable api that you can use.
low_level_polyline = polyline.fg_geom
low_level_point = point.fg_geom

# Now invoke the low-level libgeos calls.
# This first method, "project", gives you the distance "along" the linestring
# where it comes closest to the given point.
dist = low_level_polyline.project(low_level_point)
# This second method, "interpolate", takes a distance "along" the linestring,
# and returns the actual point on the linestring.
low_level_closest_point = low_level_polyline.interpolate(dist)

# Finally, wrap the low-level result in an RGeo point object
closest_point = factory.wrap_fg_geom(low_level_closest_point) 
...