Точка в KML Polygon — код C/C++

Я ищу код C или C++, чтобы определить, находится ли точка (координата) внутри многоугольника KML или нет.

Я искал, но все, что у меня есть, это javascript (apis карт Google), который может добиться того же. Я даже не могу портировать его напрямую, потому что у меня есть небольшое измененное требование:

  1. Определите, находится ли заданная координата в пределах полигона KML (код также должен исключать дыры в полигоне!).
  2. Информирование вызывающей стороны о расстоянии до ближайшего края полигона, если точка находится за пределами диапазона.

Насколько я исследовал, 2-й пункт еще нигде не был достигнут. Я хотел бы знать, как добиться этого на C или C++? Или я пропустил поиск каких-либо существующих источников?

Хотел бы иметь входные данные.


person Raj Pawan Gumdal    schedule 24.04.2013    source источник
comment
Нашел что-то очень близкое: stackoverflow.com/questions/4608661/   -  person Raj Pawan Gumdal    schedule 27.06.2013


Ответы (2)


Расширена библиотека libkml C++ с открытым исходным кодом и реализована точка в многоугольнике. Это исходный код:

https://github.com/gumdal/libkml-pointinpolygon

Мне еще предстоит достичь 2-го пункта в моем вопросе выше. Любые выводы в этом вопросе будут оценены, хотя :)

person Raj Pawan Gumdal    schedule 07.10.2013

Я искал библиотеку KML на C/C++ и наткнулся на ваш пост. Похоже, ему более 6 лет, но если кто-то еще придет сюда в поисках второй части вашего вопроса...

Я не могу вспомнить, где я откопал это в Интернете, поэтому я не могу дать / принять кредит.

// *************************************************************************
//
//  Function:   distToLine
//
//  Usage:      Calculate the shortest distance to a line
//
//  Params:     x1      - Line start x
//              y1      - Line start y
//              x2      - Line end x
//              y2      - Line end y
//              ptX     - Observation Point x
//              ptY     - Observation Point y
//
//  Returns:    Distance
//
//  Notes:
//
// *************************************************************************

double distToLine(double x1, double y1, double x2, double y2, double ptX, double ptY)
{
    double  dx;
    float   dy;
    float   t;

    dx = x2 - x1;
    dy = y2 - y1;

    if ((dx == 0) && (dy == 0))
    {
        dx = ptX - x1;
        dy = ptY - y1;
        return sqrt(dx * dx + dy * dy);
    }

    t = ((ptX - x1) * dx + (ptY - y1) * dy) / (dx * dx + dy * dy);

    if (t < 0)          // point is nearest to the first point i.e x1,y1
    {        
        dx = ptX - x1;
        dy = ptY - y1;
    }
    else if (t > 1)     // point is nearest to the end point i.e x2,y2
    {        
        dx = ptX - x2;
        dy = ptY - y2;
    }
    else                // if perpendicular line intersect the line segment.
    {        
        dx = ptX - (x1 + t * dx);
        dy = ptY - (y1 + t * dy);
    }

    return sqrt(dx * dx + dy * dy);     // returning shortest distance
}
// distToLine()
person user1970907    schedule 25.03.2019
comment
Спасибо, что заглянули, но вы указали расстояние до линии, однако я пытался найти ближайшее расстояние до полигона. Я понимаю, что многоугольник — это набор линий, и мы можем перебирать все линии в многоугольнике, однако полигон здесь может даже иметь дыры внутри, а структура KML может быть сложной. Имея это в виду, я думаю, что это не сработает для меня. Да, его коду более 6 лет, но он построен на чистом C++, так что он все еще работает. - person Raj Pawan Gumdal; 27.03.2019