2010-06-05 5 views
1

GeoDjango tutorial объясняет, как вставлять границы мира в пространственную базу данных.Как создать карту мира HTML с GeoDjango?

Я хотел бы создать карту мира в формате HTML с этими данными, используя теги map и area. Something like that.

Я просто не знаю, как получить координаты для каждой страны (требуется для атрибута areacoords).

from world.models import WorldBorders 

for country in WorldBorders.objects.all(): 
    print u'<area shape="poly" title="%s" alt="%s" coords="%s" />' % (v.name, v.name, "???") 

Спасибо!

ответ

0

В примере worldborders атрибут mpoly - это место, где фактически хранится географический многоугольник.

В вашем примере, вы будете хотеть, чтобы получить доступ к v.mpoly

Вы не собираетесь быть в состоянии использовать его непосредственно, однако, поскольку mpoly само по себе является MultiPolygonfield. Рассмотрим такую ​​страну, как Канада, у которой есть куча островов, каждый остров и главная земля - ​​многоугольник. Поэтому, чтобы добраться до ваших точек и получить полное описание границ Канады, вам необходимо:

  1. Итерации над многоугольниками внутри многополигона. Каждый многоугольник соответствует области (поэтому ваше предположение в примере одной области на страну неверно).
  2. Итерации над точками внутри каждого polygon.
  3. Преобразуйте координаты point (широта/долгота) в координаты, используемые вашей графикой svg.
+0

Я понял вашу логику, спасибо! Когда вы говорите «Преобразовать lat/lon в координаты для SVG-графики», вы имеете в виду, что мне просто нужно сделать простое дополнение? – user176455

0

Чтобы использовать lat/lon в SVG, вам необходимо проецировать их в пространство пикселей (x/y). Простое преобразование может выглядеть следующим образом:

>>> x = (lon + 180)/360 * image_width 
>>> y = (90 - lat)/180 * image_height 

Для изображения, где image_width == 2 * image_height, это даст вам что-то вроде карты по ссылке публикуемой (который выглядит как equirectangular projection).

Чтобы использовать другой проектор (например, Mercator), используйте метод GEOSGeometry.transform в GeoDjango перед применением преобразования.