Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.221.41.214] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Доброго времени суток!
Есть определенный квадрат координат, хранится в БД 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? Заранее большое спасибо. |
Сообщ.
#2
,
|
|
|
В данном случае (меридионально-параллельный кусок) - точно так же, как проверка точки в прямоугольнике.
Можно даже домножить координаты на миллион, привести к целым числам, и использовать PtInRect |
Сообщ.
#3
,
|
|
|
А можно примерчиком, если не сложно)))
|
Сообщ.
#4
,
|
|
|
А что именно непонятно? lat как Y-координата, lon как X
|
Сообщ.
#5
,
|
|
|
Цитата инженеру, физику, и математику дали задание построить самый большой забор из ограниченного числа досок. Инженер построил квадратный забор, физик круглый, а математик построил маленький тесный заборчик, залез внутрь и сказал: Допустим я нахожусь снаружи ! |
Сообщ.
#6
,
|
|
|
Как перевести географические координаты в плоскую, что бы сравнить расположена точка в квадрате или нет
|
Сообщ.
#7
,
|
|
|
Да я вроде уже всё сказал
|
Сообщ.
#8
,
|
|
|
Нашел пример на PHP, к сожалению я не разбираюсь в этом коде. Помогите пожалуйста разжевать этот код
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; } Вы уж простите меня, что так туго доходит. В школе плохо учился(( |
Сообщ.
#9
,
|
|
|
Цитата BackUp @ Как перевести географические координаты в плоскую, что бы сравнить расположена точка в квадрате или нет Зачем? В каких координатах задан "квадрат", в таких и нужно проверять расположение точки в этом "квадрате". Цитата BackUp @ Есть определенный квадрат координат, хранится в БД MySQL следующим образом: ... Существенные вопросы: 1) всегда ли стороны квадрата параллельны осям (lat,lng), 2) если да, то в какой последовательности хранятся вершины квадрата? В приведенном примере квадрат параллелен осям и вершины хранятся в последовательности от левого-верхнего угла против часовой стрелки. В этом случае задачка решается тривиально (даже для тех, кто "в школе плохо учился" ). В этом случае точкой с минимальными значениями (lat,lng) является точка №2, а с максимальными - №4. Соотв-но условием попадания точки P в такой квадрат\прямоугольник R[1..4] будет: Result:=(P.lat >= R[2].lat) and (P.lng >= R[2].lng) and (P.lat <= R[4].lat) and (P.lng <= R[4].lng); Если же квадрат\прямоугольник м.б. не параллелен осям, или его вершины могут хранится в произвольном порядке, то можно использовать общий подход для проверки попадания точки в выпуклый многоугольник - точка должна лежать по одну сторону (слева или справа) от всех сторон\ребер многоугольника 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 |
Сообщ.
#10
,
|
|
|
leo Спасибо огромное!
Прошу прошения что не сразу отписался. Сегодня проверил, все работает отлично)). Очень помог Ваш пример. |
Сообщ.
#11
,
|
|
|
Заполняю в цикле массив [{"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;
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; Что не правильно я делаю. Результат всегда отрицательный(( |
Сообщ.
#12
,
|
|
|
Что бы быстро себя проверить, можно сформированный полигон на подручном Image отрисовать (как вариант - Canvas.LineTo()), и точку прицела наглядно отобразить Image1.Canvas.Pixels[]:=rgb() (или даже наглядней - Image1.Canvas.Ellipse)... - дело 10 минут, и вполне может прояснить, на сколько правильно введены координаты.
|
Сообщ.
#13
,
|
|
|
BackUp
Перечитай, что leo написал про порядок перечисления вершин. |
Сообщ.
#14
,
|
|
|
Цитата BackUp @ Заполняю в цикле массив Видимо неправильно заполняешь массив, т.к. если те же координаты записать явно в виде 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)); |
Сообщ.
#15
,
|
|
|
Блин, действительно массив заполнялся не верно...
|