使用GeoDjango在坐标系统间转换
我正在尝试在我的数据库中添加坐标信息,为我的应用添加 django.contrib.gis
支持。我正在编写一个 south
数据迁移,目的是从数据库中获取地址,然后向谷歌请求坐标(到目前为止,我觉得使用 geopy
是个不错的选择)。
接下来,我需要将谷歌返回的坐标从 WGS84:4326
(谷歌的坐标系统)转换为 WGS84:22186
(我自己的坐标系统)。
我在 GeoDjango 的文档中找不到方法来实现这个转换。到目前为止,我了解到我需要这样做:
gcoord = SpatialReference("4326")
mycoord = SpatialReference("22186")
trans = CoordTransform(gcoord, mycoord)
但是,我不知道如何使用那个 CoordTransform
对象……看起来它是由 GDAL 的数据对象使用的,但这对我想做的事情来说有点复杂了……
2 个回答
12
如果你已经正确安装了所有的库,就不需要使用CoordTransform
这个对象了。只要你知道你想要的srid
值,点对象的transform
方法就可以帮你完成这个工作。
>>> from django.contrib.gis.geos import Point
>>> pnt = Point(30, 50, srid=4326)
>>> desired_srid = 22186
>>> pnt.transform(desired_srid)
>>> pnt.ewkt
u'SRID=22186;POINT (11160773.5712331663817167 19724623.9116888605058193)'
9
确实,CoordTransform这个功能需要GDAL才能正常工作。不过,其它部分其实很简单:
>>> from django.contrib.gis.gdal import SpatialReference, CoordTransform
>>> from django.contrib.gis.geos import Point
>>> gcoord = SpatialReference(4326)
>>> mycoord = SpatialReference(22186)
>>> trans = CoordTransform(gcoord, mycoord)
>>> pnt = Point(30, 50, srid=4326)
>>> print 'x: %s; y: %s; srid: %s' % (pnt.x, pnt.y, pnt.srid)
x: 30.0; y: 50.0; srid: 4326
>>> pnt.transform(trans)
>>> print 'x: %s; y: %s; srid: %s' % (pnt.x, pnt.y, pnt.srid)
x: 11160773.5712; y: 19724623.9117; srid: 22186
请注意,点的转换是直接在原位置进行的。