Нарисовать многоугольник для заданного набора путевых точек или линию?

Гиевн ГеоЛайн

На приведенном выше рисунке показана геолиния (1–11). Каждая точка является геокоординатой.

Для данной геолинии мне нужно нарисовать многоугольник (ограничивающий прямоугольник), как на изображении выше.

Это нужно для того, чтобы найти любую точку интереса (POI), такую ​​​​как ПАРКОВКА, ТОПЛИВО, РЕСТОРАН, рядом с этой GeoLine (Path / WayPoints) (20 / 30 метров с каждой стороны geoLine. Не более 50 метров.)

Я предполагаю, что у Elasticsearch есть функция, в которой вы можете указать точки многоугольника, и он дает то, что находится внутри этого многоугольника. Для этого мне нужны все точки многоугольника, как на рис. выше.

Может кто-нибудь, пожалуйста, скажите мне, как подойти к этому? Любое объяснение вместе с кодом будет полезно.

Путевые точки:

13.0489062,77.6037472 13.0493921,77.6028423 13.0494861,77.6017586 13.0491692,77.6010208 13.0482264,77.6010494 13.0472498,77.6010711 13.0461878,77.6011007 13.0454626,77.6010805 13.0446403,77.6011248 13.0438409,77.6010804 13.0438986,77.6017758 13.0438545,77.6030737 13.0439865,77.6040809 13.0439203,77.6056271 13.0438668,77.6066616 13.0436551,77.6077865 13.0434993,77.6088242 13.0432396,77.609767 13.0429808,77.6104908 13.0428103,77.6112412 13.0426729,77.6121114 13.0424444,77.6129859 13.0422521,77.6136721 13.0418346,77.6145997 13.0415062,77.6155134 13.0412306,77.6162379 13.0409749,77.6171142 13.0410531,77.6178208 13.0411159,77.618711 13.0411254,77.6195973 13.0410934,77.6203541 13.0412376,77.6215924 13.0412091,77.6223422 13.0410685,77.6234799 13.0404355,77.6241354 13.0398567,77.6245906 13.038993,77.6252223 13.0381411,77.6258873

EDIT: язык JAVA.


person Shreyas Rao B    schedule 26.06.2016    source источник
comment
Запрос Elasticsearch будет запросом geo_shape с отношением WITHIN, передающим сгенерированный многоугольник в качестве формы. Если вы используете Java, вы сможете создать многоугольник с помощью JTS (Java Topology Suite).   -  person Russ Cam    schedule 26.06.2016
comment
@RussCam Вы использовали JTS? Я не. Так что любой код, если вы могли бы предоставить его полезным.   -  person Shreyas Rao B    schedule 26.06.2016
comment
Если я дам вам немного математики о том, как сгенерировать точки для многоугольника, сможете ли вы это реализовать?   -  person    schedule 27.06.2016
comment
@willywonkadailyblah Я обязательно попробую.   -  person Shreyas Rao B    schedule 27.06.2016
comment
@willywonkadailyblah, не могли бы вы рассказать об этом?   -  person Shreyas Rao B    schedule 27.06.2016


Ответы (1)


Возьмем два ребра, определяемые тремя точками P[n-1], P[n] и P[n+1], с нормалями m1 и m2 соответственно.

введите здесь описание изображения введите здесь описание изображения

Позволять

введите здесь описание изображения

Тогда нормальные значения

введите здесь описание изображения

введите здесь описание изображения

Теперь расстояние Q от P[n] по m0 равно

введите здесь описание изображения

И потому

введите здесь описание изображения

Где Q' — точка многоугольника на другой стороне.


РЕДАКТИРОВАТЬ: реализация C:

#include <stdlib.h>
#include <math.h>
#include "bmp.h"

typedef struct v { double x, y; } vec_t;
#define VECT(x, y) (vec_t){x, y}

vec_t v_add(vec_t a, vec_t b) { return VECT(a.x + b.x, a.y + b.y); }
vec_t v_sub(vec_t a, vec_t b) { return VECT(a.x - b.x, a.y - b.y); }
vec_t v_mul(vec_t v, double c) { return VECT(v.x * c, v.y * c); }
vec_t v_div(vec_t v, double d) { return v_mul(v, 1.0 / d); }
double v_dot(vec_t a, vec_t b) { return a.x * b.x + a.y * b.y; }
double v_mag(vec_t a) { return sqrt(a.x * a.x + a.y * a.y); }
vec_t v_nor(vec_t v) { return v_div(v, v_mag(v)); }
vec_t v_prp(vec_t v) { return VECT(-v.y, v.x); }

vec_t get_disp(vec_t i, vec_t j, vec_t k, double d)
{
    vec_t a = v_sub(j, i), b = v_sub(k, j);
    vec_t m1 = v_nor(v_prp(a)), m2 = v_nor(v_prp(b));
    vec_t m0 = v_nor(v_add(m1, m2));
    return v_mul(m0, d / v_dot(m0, m1));
}

void compute_polygon(vec_t* P, vec_t* Q, int N, double d)
{
    int T = 2 * N - 1;
    for (int i = 1; i < N - 1; i++)
    {
        vec_t M = get_disp(P[i - 1], P[i], P[i + 1], d);
        Q[i]     = v_add(P[i], M); 
        Q[T - i] = v_sub(P[i], M);
    }
    vec_t A = v_mul(v_nor(v_prp(v_sub(P[1], P[0]))), d);
    vec_t B = v_mul(v_nor(v_prp(v_sub(P[N-1], P[N-2]))), d);
    Q[0] = v_add(P[0], A); Q[T] = v_sub(P[0], A);
    Q[N - 1] = v_add(P[N - 1], B); Q[N] = v_sub(P[N - 1], B);
}

int iround(double c) { return (int)((c > 0.0) ? c+0.5 : c-0.5); }
void draw_line(bmp_t* i, vec_t a, vec_t b, int c)
{
    bmp_aux_draw_line(i, iround(a.x), iround(a.y), iround(b.x), iround(b.y), c);
}
void draw_dot(bmp_t* i, vec_t p, int c)
{
    bmp_aux_draw_dot(i, iround(p.x), iround(p.y), 3, c);
}

int main()
{
    const int N = 5;
    vec_t P[N], Q[2*N];
    P[0] = VECT(30, 30);
    P[1] = VECT(70, 150);
    P[2] = VECT(130, 170);
    P[3] = VECT(190, 240);
    P[4] = VECT(270, 190);
    compute_polygon(P, Q, N, 10.0);
    bmp_t* img = bmp_new(300, 300);
    for (int i = 0; i < N-1; i++)
    {
        draw_line(img, P[i], P[i+1], 0);
        draw_dot(img, P[i], 0x0000FF);
    }
    draw_dot(img, P[N-1], 0x0000FF);
    for (int i = 0; i < 2*N-1; i++)
        draw_line(img, Q[i], Q[i + 1], 0xEEEE00);
    draw_line(img, Q[0], Q[2*N-1], 0xEEEE00);
    bmp_write(img, "a.bmp");
    bmp_free(img);

    return 0;
}

введите здесь описание изображения

Указывает на (30, 30), (70, 150), (130, 170), (190, 240), (270, 190).

person Community    schedule 27.06.2016
comment
Думаю, в JAva нет указателей. Как мне поступить? А как это cos(Beta/2)? я думаю, что это cos(Beta) и то же самое для других. - person Shreyas Rao B; 28.06.2016
comment
Извините опечатка :) исправлю. Просто передайте массив. - person ; 28.06.2016
comment
Сообщит вам о результате. - person Shreyas Rao B; 28.06.2016
comment
Я вижу, что это значение d указывает на сдвиг в градусах. И v_dot(m0, m1) принесет s. что определяет это значение s? это расстояние между двумя точками? - person Shreyas Rao B; 29.06.2016
comment
d – расстояние от полигона до вашего пути по перпендикуляру. s — это расстояние между P[n] и Q. рад слышать, что это сработало. - person ; 29.06.2016
comment
если d варьировалось, то размер полигона также будет варьироваться (по моим наблюдениям). d в каких единицах? км/мили/см? - person Shreyas Rao B; 29.06.2016
comment
@ShreyasRaoB да, вам нужно указать d как свойство многоугольника. в компьютерной геометрии все относительно, поэтому d находится в тех же единицах измерения, что и ваша геометрия пути (но идея единиц определяется вы) - person ; 29.06.2016
comment
Не могли бы вы помочь мне в этом - person Shreyas Rao B; 05.08.2016