elasticsearch,geometry,polygon,jts,Java,elasticsearch,Geometry,Polygon,Jts" /> elasticsearch,geometry,polygon,jts,Java,elasticsearch,Geometry,Polygon,Jts" />

Java 为给定的一组航路点或一条直线绘制多边形?

Java 为给定的一组航路点或一条直线绘制多边形?,java,elasticsearch,geometry,polygon,jts,Java,elasticsearch,Geometry,Polygon,Jts,上图显示了一条地界线(1-11)。每个点都是一个坐标系 对于给定的地界线,我需要绘制一个多边形(一个边界框),如上图所示 这是为了在该地界线(路径/航路点)附近找到任何兴趣点(POI),如停车场、燃油、餐厅(地界线两侧各20/30米,不超过50米) 我猜Elasticsearch有一个功能,你可以指定多边形点,它给出多边形内部的内容。为了做到这一点,我需要多边形的所有点,如上图所示 有人能告诉我怎么做吗?代码中的任何解释都会很有帮助 航路点: 13.0489062,77.6037472 13.0

上图显示了一条地界线(1-11)。每个点都是一个坐标系

对于给定的地界线,我需要绘制一个多边形(一个边界框),如上图所示

这是为了在该地界线(路径/航路点)附近找到任何兴趣点(POI),如停车场、燃油、餐厅(地界线两侧各20/30米,不超过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。

取由三个点定义的两条边,分别为
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;
}
#包括
#包括
#包括“bmp.h”
typedef结构v{double x,y;}vec\t;
#定义向量(x,y)(向量){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);}
向量(向量,双c){返回向量(v.x*c,v.y*c);}
vec_t v_div(vec_t v,double d){return v_mul(v,1.0/d);}
双v_点(向量a,向量b){返回a.x*b.x+a.y*b.y;}
双v_-mag(vec_-ta){返回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);}
向量获取显示(向量i、向量j、向量k、双d)
{
向量a=v_sub(j,i),b=v_sub(k,j);
向量m1=v_nor(v_prp(a)),m2=v_nor(v_prp(b));
vec_t m0=v_nor(v_add(m1,m2));
返回v_mul(m0,d/v_点(m0,m1));
}
void compute_多边形(向量t*P,向量t*Q,整数N,双d)
{
int T=2*N-1;
对于(int i=1;i0.0)?c+0.5:c-0.5);}
无效绘制线(bmp\u t*i、向量a、向量b、int c)
{
bmp_辅助绘制线(i,iround(a.x)、iround(a.y)、iround(b.x)、iround(b.y)、c);
}
无效绘制点(bmp\u t*i、vec\u t p、int c)
{
bmp_aux_draw_dot(i,iround(p.x),iround(p.y),3,c);
}
int main()
{
常数int N=5;
向量P[N],Q[2*N];
P[0]=VECT(30,30);
P[1]=VECT(70150);
P[2]=VECT(130170);
P[3]=VECT(190240);
P[4]=VECT(270190);
计算多边形(P,Q,N,10.0);
bmp_t*img=bmp_new(300300);
对于(int i=0;i


位于(30,30)、(70,150)、(130,170)、(190,240)、(270,190)的点。

Elasticsearch查询将是一个
geo_形状
查询,具有
内部关系,将生成的多边形作为形状传递。如果您使用的是Java,那么就可以使用JTS(Java拓扑套件)创建多边形@RussCam您使用过JTS吗?我没有。如果你能提供一些有用的代码。如果我给你一些关于如何为多边形生成点的数学知识,你能实现它吗?@willywonkadailyblah我一定会尝试一下。@willywonkadailyblah你能提供一些想法吗?我想JAva中没有指针。我该如何进行?它是怎样的
cos(Beta/2)
?我认为它的
cos(Beta版)
和其他版本一样。对不起,错别字:)可以修复。只需传入一个数组。将向您提供有关结果的信息。我看到这个
d
值表示度偏移。而
v_点(m0,m1)
将获取
s
s
的这个值定义了什么?是两点之间的距离吗?
d
是多边形与路径的垂直距离
s
P[n]
Q
之间的距离。很高兴听到它成功了。