Проекции

Mapserver, GeoServer, MapGuide, Google и другое ПО для веб-картографии
Ответить
awonderv
Интересующийся
Сообщения: 15
Зарегистрирован: 26 сен 2011, 15:51
Репутация: 0

Проекции

Сообщение awonderv »

Доброго всем дня! Пытаюсь собрать связку PostGIS-Mapnik-Openlayers с использованием EPSG900913. Все выглядит, конечно просто, да и в Сети инструкций хватает, но все таки есть проблема. Кто знает, подскажите.

Проблема: при совмещении в OpenLayers двух слоев(OSM и моего TMS) не совпадают проекции, хотя вроде все в меркаторе. Точка 2, к примеру должна соответствовать Москве.
Снимок1.png
Снимок1.png (257.54 КБ) 3445 просмотров
А теперь по порядку:
Рисую значит я карту из двух слоев:

Код: Выделить всё

function init() {
            var options = {
                projection: new OpenLayers.Projection("EPSG:900913"),
                units: 'm',
                maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34),
                maxResolution: 156543.0399
            };
            map = new OpenLayers.Map('map',options);
            layer = new OpenLayers.Layer.TMS('TMS',
                    "http://127.0.0.1:8000/shape-editor/tms/",
                    {serviceVersion: "1.0",
                        layername: "ip",
                        type: 'png',
                        isBaseLayer:false,
                        transparent: true,
                        projection:map.projection,
                        numZoomLevels: 19});
            mapnikLayer=new OpenLayers.Layer.OSM("OpenStreetMap (Mapnik)");
            map.addLayers([mapnikLayer,layer]);
            map.zoomToMaxExtent();
        }
Тайлы генерирую так:

Код: Выделить всё

MAX_ZOOM_LEVEL = 19
TILE_WIDTH = 256
TILE_HEIGHT = 256

def _unitsPerTile(zoomLevel):
    return 400075016.68 / math.pow(2, zoomLevel)

def tile(request,xml_schema, zoom, x, y):
    try:
        zoom = int(zoom)
        x= int(x)
        y= int(y)

        if zoom < 0 or zoom > MAX_ZOOM_LEVEL:
            raise Http404

        delta = _unitsPerTile(zoom)
        minLong = x * delta - 200037508.34
        minLat = y * delta - 200037508.34
        maxLong = minLong + delta
        maxLat = minLat + delta

        mapfile = "geoip/mapnikStyles/ip.xml"
        map = mapnik.Map(TILE_WIDTH,TILE_HEIGHT)
        mapnik.load_map(map,mapfile)
        map.zoom_to_box(mapnik.Envelope(minLong, minLat,maxLong, maxLat))
        image = mapnik.Image(TILE_WIDTH, TILE_HEIGHT)
        mapnik.render(map, image)
        imageData = image.tostring('png')
        return HttpResponse(imageData, mimetype="image/png")

    except:
        traceback.print_exc()
        return HttpResponse("")
Mapnik XML схема:

Код: Выделить всё

<Map srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +units=m +k=1.0 +nadgrids=@null +no_defs">
	<Datasource name="commonDB">
		<Parameter name="type">postgis</Parameter>
		<Parameter name="dbname">django</Parameter>
		<Parameter name="extent">-20037508,-19929239,20037508,19929239</Parameter>
		<Parameter name="host">127.0.0.1</Parameter>
		<Parameter name="port">5432</Parameter>
		<Parameter name="multiple_geometries">true</Parameter>
		<Parameter name="password">123</Parameter>
		<Parameter name="srid">900913</Parameter>
		<Parameter name="user">wonder</Parameter>
	</Datasource>

	<Style name="point">
		<Rule>
			<PointSymbolizer>
			</PointSymbolizer>
		</Rule>
	</Style>

	<Style name="link">
		<Rule>
			<LineSymbolizer>
			</LineSymbolizer>
		</Rule>
	</Style>

	<Layer name="points" >
		<StyleName>point</StyleName>
		<Datasource base="commonDB">
			<Parameter name="table">geoip_point</Parameter>
		</Datasource>
	</Layer>

	<Layer name="lines" >
		<StyleName>link</StyleName>
		<Datasource base="commonDB">
			<Parameter name="table">geoip_link</Parameter>
		</Datasource>
	</Layer>


</Map>
В таблице точек:

Код: Выделить всё

# SELECT id,ST_SRID(point_geom),ST_X(point_geom),ST_Y(point_geom) from geoip_point; 
 id | st_srid |       st_x       |       st_y       
----+---------+------------------+------------------
  1 |  900913 | 4187349.50310973 | 7509243.22427264
  2 |  900913 | 768104.497089842 | 6659715.59821099
  3 |  900913 | 6172897.64298635 | 4490855.01380304
  4 |  900913 | 4289607.52212616 | 13864590.0782239
(4 rows)
Отсюда мое негодование: все данные в 900913, а при совмещении-ошибка.
Заранее спасибо за ответы.
awonderv
Интересующийся
Сообщения: 15
Зарегистрирован: 26 сен 2011, 15:51
Репутация: 0

Re: Проекции

Сообщение awonderv »

Похоже ни у кого нет предположений.. Попробовал действовать как в этой теме: viewtopic.php?f=19&t=7501&p=42565&hilit=mapnik#p42565 но безрезультатно.
awonderv
Интересующийся
Сообщения: 15
Зарегистрирован: 26 сен 2011, 15:51
Репутация: 0

Re: Проекции

Сообщение awonderv »

Спасибо за ответы) косяк был в tms сервисе. Заменил его на WMS и все заработало отлично

Код: Выделить всё

from django.http import HttpResponse


map_cache = None

class MapCache(object):
    def __init__(self,mapfile,srs):
        self.map = mapnik.Map(1,1)
        mapnik.load_map(self.map,mapfile)
        self.map.srs = srs

def wms(request):
    global map_cache
    w,h = int(request.GET['WIDTH']), int(request.GET['HEIGHT'])
    mime = request.GET['FORMAT']
    p = mapnik.Projection("+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs +over")
    layerName=request.GET['LAYERNAME']
    if layerName=='ip':
        mapfile = "geoip/mapnikStyles/ip.xml"
    else:
        raise Http404
    if not map_cache:
        map_cache = MapCache(mapfile,p.params())
    env = map(float,request.GET['BBOX'].split(','))

    tile = map_cache.map
    tile.buffer_size = 128
    try:
        tile.resize(w,h)
    except:
        tile.width = w
        tile.height = h
    tile.zoom_to_box(mapnik.Envelope(*env))
    draw = mapnik.Image(tile.width, tile.height)
    mapnik.render(tile,draw)
    image = draw.tostring(str(mime.split('/')[1]))
    response = HttpResponse()
    response['Content-length'] = len(image)
    response['Content-Type'] = mime
    response.write(image)
    return response
Ответить

Вернуться в «Веб-картография»

Кто сейчас на конференции

Сейчас этот форум просматривают: Semrush [Bot] и 1 гость