На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Работа с координатами GPS , Определение место положения в квадрате координат GPS
    Доброго времени суток!

    Есть определенный квадрат координат, хранится в БД MySQL следующим образом:
    Цитата
    [{"lat":41.94664, "lng":-87.74949},{"lat":41.94224, "lng":-87.74949},{"lat":41.94224, "lng":-87.74509},{"lat":41.94664, "lng":-87.74509}]
    . Причем соединяющих точек на карте может быть четыре или даже пять.

    Как я могу узнать, нахожусь ли я в определенном квадрате зная свои координаты GPS?

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

      Можно даже домножить координаты на миллион, привести к целым числам, и использовать PtInRect
        А можно примерчиком, если не сложно)))
          А что именно непонятно? lat как Y-координата, lon как X
            Цитата
            инженеру, физику, и математику дали задание построить самый большой забор из ограниченного числа досок. Инженер построил квадратный забор, физик круглый, а математик построил маленький тесный заборчик, залез внутрь и сказал: Допустим я нахожусь снаружи !
              Как перевести географические координаты в плоскую, что бы сравнить расположена точка в квадрате или нет
                Да я вроде уже всё сказал
                  Нашел пример на PHP, к сожалению я не разбираюсь в этом коде. Помогите пожалуйста разжевать этот код

                  ExpandedWrap disabled
                    foreach ($allemptypoints as $emptypoint) {
                            $arrpoligon = json_decode($emptypoint['coordinates']);
                            $minlat = abs($arrpoligon[1]['lat']);
                            $maxlat = abs($arrpoligon[0]['lat']);
                            $minlng = abs($arrpoligon[2]['lng']);
                            $maxlng = abs($arrpoligon[0]['lng']);
                     
                    // Если попала один раз активируем, повторно утверждаем сохраняем в базу изменение состояния и останавливаем цикл
                            if (($minlat <= abs($checkpoint_lat)) && (abs($checkpoint_lat) < $maxlat) && ($minlng <= abs($checkpoint_lng)) && (abs($checkpoint_lng) <= $maxlng)) {
                                $status = ($emptypoint['status'] == 0) ? 1 : 2;
                                $sql = "UPDATE routs_points SET status = :status WHERE point_id = :point_id";
                                $sql->bind(array(':status' => $status, ':point_id' => $emptypoint['point_id']));
                                $sql->execute();
                                break;
                            }


                  Вы уж простите меня, что так туго доходит. В школе плохо учился((
                  Сообщение отредактировано: BackUp -
                    Цитата BackUp @
                    Как перевести географические координаты в плоскую, что бы сравнить расположена точка в квадрате или нет

                    Зачем? В каких координатах задан "квадрат", в таких и нужно проверять расположение точки в этом "квадрате".

                    Цитата BackUp @
                    Есть определенный квадрат координат, хранится в БД MySQL следующим образом: ...

                    Существенные вопросы: 1) всегда ли стороны квадрата параллельны осям (lat,lng), 2) если да, то в какой последовательности хранятся вершины квадрата?
                    В приведенном примере квадрат параллелен осям и вершины хранятся в последовательности от левого-верхнего угла против часовой стрелки. В этом случае задачка решается тривиально (даже для тех, кто "в школе плохо учился" ;)). В этом случае точкой с минимальными значениями (lat,lng) является точка №2, а с максимальными - №4. Соотв-но условием попадания точки P в такой квадрат\прямоугольник R[1..4] будет:
                    ExpandedWrap disabled
                      Result:=(P.lat >= R[2].lat) and (P.lng >= R[2].lng) and (P.lat <= R[4].lat) and (P.lng <= R[4].lng);

                    Если же квадрат\прямоугольник м.б. не параллелен осям, или его вершины могут хранится в произвольном порядке, то можно использовать общий подход для проверки попадания точки в выпуклый многоугольник - точка должна лежать по одну сторону (слева или справа) от всех сторон\ребер многоугольника
                    ExpandedWrap disabled
                      type
                        TGeoPoint = record
                          lat,lon:double;
                        end;
                      function PointInPolygon(const P:TGeoPoint; const Poly:array of TGeoPoint):boolean;
                      var
                        s,ss:double;
                        i,j:integer;
                      begin
                        Result:=false;
                        s:=0;
                        for i:=0 to High(Poly) do
                        begin
                          j:=i+1;
                          if j > High(Poly) then j:=0;
                          //вычисляем векторное произведение, пропорциональное sin угла между векторами: > 0 - точка слева, < 0 - справа от ребра полигона
                          ss:=(P.lat-Poly[i].lat)*(Poly[j].lon-Poly[i].lon)-(P.lon-Poly[i].lon)*(Poly[j].lat-Poly[i].lat);
                          if ss <> 0 then
                          begin    
                            if s*ss < 0 then Exit; //точка по разные стороны от ребер - значит вне полигона
                            s:=ss;
                          end;
                        end;
                        Result:=true;
                      end;


                    PS: Вообще-то в MySql д.б. функции для работы с пространственными данными (spatial functions), в частности MBRWithin и ST_Within
                      leo Спасибо огромное!

                      Прошу прошения что не сразу отписался. Сегодня проверил, все работает отлично)). Очень помог Ваш пример.
                        Заполняю в цикле массив [{"lat":55.68144,"lng":37.59102},{"lat":55.68251,"lng":37.59116},{"lat":55.68220,"lng":37.59382},{"lat":55.68121,"lng":37.59372}] координатами, ввиде r[1].lat:= 55.68144, r[1].lon:= 37.59102;
                        ExpandedWrap disabled
                          type
                            TGeoPoint = record
                              lat,lon: Double;
                            end;
                           
                          procedure TForm1.Button1Click(Sender: TObject);
                          var
                            R: array [1..4]of TGeoPoint;
                            lat,lng: string;
                            P: TGeoPoint;
                          begin  
                            p.lat:= 55.681887;
                            p.lon:= 37.592105;
                           
                            if PointInPolygon(p,r) then ShowMessage('Не попал((');
                          end;


                        Что не правильно я делаю. Результат всегда отрицательный((
                        Сообщение отредактировано: BackUp -
                          Что бы быстро себя проверить, можно сформированный полигон на подручном Image отрисовать (как вариант - Canvas.LineTo()), и точку прицела наглядно отобразить Image1.Canvas.Pixels[]:=rgb() (или даже наглядней - Image1.Canvas.Ellipse)... - дело 10 минут, и вполне может прояснить, на сколько правильно введены координаты. :rolleyes:
                            BackUp
                            Перечитай, что leo написал про порядок перечисления вершин.
                              Цитата BackUp @
                              Заполняю в цикле массив

                              Видимо неправильно заполняешь массив, т.к. если те же координаты записать явно в виде
                              ExpandedWrap disabled
                                const
                                  R: array [1..4]of TGeoPoint = (
                                    (lat:55.68144; lon:37.59102),
                                    (lat:55.68251; lon:37.59116),
                                    (lat:55.68220; lon:37.59382),
                                    (lat:55.68121; lon:37.59372));
                              то всё работает нормально
                                Блин, действительно массив заполнялся не верно...
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0363 ]   [ 16 queries used ]   [ Generated: 1.05.24, 23:09 GMT ]