如何使用 GeoDjango 创建 HTML 世界地图?

发布于 2024-09-04 04:56:28 字数 617 浏览 8 评论 0原文

GeoDjango 教程 解释了如何将世界边界插入到空间数据库。

我想用这些数据创建一个 HTML 世界地图,并带有 maparea 标签。 类似的东西

我只是不知道如何检索每个国家/地区的坐标(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, "???")

谢谢 !

The GeoDjango tutorial explains how to insert world borders into a spatial database.

I would like to create a world Map in HTML with these data, with both map and area tags. Something like that.

I just don't know how to retrieve the coordinates for each country (required for the area's coords attribute).

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, "???")

Thanks !

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

梦行七里 2024-09-11 04:56:28

在 worldborders 示例中,属性 mpoly 是地理多边形实际存储的位置。

在您的示例中,您将想要访问 v.mpoly

但是您将无法直接使用它,因为 mpoly 本身就是一个 MultiPolygon 字段。考虑像加拿大这样的国家,它有很多岛屿,每个岛屿和主要陆地都是一个多边形。因此,要得出您的观点以及加拿大边界的完整描述,您需要:

  1. 迭代多边形内部的多边形。每个多边形对应一个区域(因此您在每个国家一个区域的示例中的假设是错误的)。
  2. 迭代每个多边形内的点。
  3. 转换您的 坐标(纬度/经度)输入 svg 图形使用的坐标。

In the worldborders example, the attribute mpoly is where the geographic polygon is actually stored.

In your example, you're going to want to access v.mpoly

You're not going to be able to use it directly however because mpoly is itself a MultiPolygon field. Consider a country like Canada that has a bunch of islands, each island and the main landmass is a polygon. So to arrive at your points and a complete description of Canada's borders you need to:

  1. Iterate over the polygons inside of multipolygon. Each polygon corresponds to an area (so your assumption in the example of one area per country is wrong).
  2. Iterate over the points inside of each polygon.
  3. Convert your point coordinates (latitude/longitude) into the coordinates used by your svg graphic.
℉絮湮 2024-09-11 04:56:28

要在 SVG 中使用纬度/经度,您需要将它们投影到像素 (x/y) 空间中。一个简单的转换可能如下所示:

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

对于 image_width == 2 * image_height 的图像,这将为您提供类似于发布链接处的地图的内容(看起来像 等距矩形投影)。

要使用不同的投影(例如 Mercator),请使用 GEOSGeometry.transform 方法在 GeoDjango 之前应用转换。

To use lat/lon in an SVG, you need to project them into pixel (x/y) space. A simple transformation might look like this:

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

For an image where image_width == 2 * image_height, this will give you something like the map at the link posted (which looks like an equirectangular projection).

To use a different projection (e.g. Mercator), use the GEOSGeometry.transform method in GeoDjango before applying the transform.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文