Координаты формата запроса геоджанго - конвертируйте лат, открывайте карту улиц

У меня есть полигон в моих модельных городах, но на моей карте, например, Богота имеет координату -8243997.66798 , 517864.86656 -> открыть карты улиц; но мне нужно сделать запрос с координатами, такими как (4.697857, -74.144554) -> Карты Google.

pnt = 'POINT(%d %d)'%(lon, lat)
zonas = ciudad.zona_set.filter(polygon__contains=pnt)

Зоны пустые:/, как я могу конвертировать lat а также lon для стандартных координат в открытой карте улиц, или как узнать код Srid для одного входа (lat,lon)

pnt = GEOSGeometry('POINT(-96.876369 29.905320)', srid=srid_from_lat_lon)

Спасибо

1 ответ

При выполнении пространственных запросов рекомендуется передавать геометрию с указанной системой пространственной привязки (srid). Таким образом, GeoDjango автоматически преобразует геометрию входного запроса в систему координат вашей таблицы (системы координат вашей модели города в вашем случае).

В первом примере кода, который вы дали, вы не указываете srid для геометрии, поэтому pnt = 'POINT(%d %d)'%(lon, lat) не имеет срид. В этом случае GeoDjango будет предполагать, что srid одинаково для входных данных и таблицы данных модели. Что не так в вашем примере, и именно поэтому вы не получите никаких совпадений.

Таким образом, вам нужно будет указать точку с правильным SRID. Если вы получаете координаты из OSM, скорее всего, координаты находятся в проекции Web Mercator, у которой есть srid 3857, Эта проекция часто используется в веб-картографии.

Для этого вы можете использовать формат EWKT (который по сути является SRID + WKT) следующим образом:

pnt = 'SRID=4326;POINT(-96.876369 29.90532)'

Или, если у вас есть координаты в Web Mercator Projection, должно работать следующее:

pnt = 'SRID=3857;POINT(-8243997.66798  517864.86656)'
zonas = ciudad.zona_set.filter(polygon__contains=pnt)

Просто для справки, вот несколько примеров того, как вернуться назад между EWKT и GEOSGeometries:

Так что это (обычный WKT, с srid, указанным при создании геометрии)

GEOSGeometry('POINT(-8243997.66798  517864.86656)', srid=3857)

эквивалентно этому (srid содержится в строке EWKT):

GEOSGeometry('SRID=3857;POINT(-8243997.66798  517864.86656)')
Другие вопросы по тегам