как выделить объект на карте цветом?

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

как выделить объект на карте цветом?

Сообщение s_r_b »

Привет. Использую MapServer+OpenLayers. также стоит postgis. Вопрос такой: как при клике на объект(например дом) выделить его цветом?
Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: как выделить объект на карте цветом?

Сообщение Denis Rykov »

Если слой векторный, то воспользоваться контролом SelectFeature (пример), если растровый, то идеи можно посмотреть здесь.
Spatial is now, more than ever, just another column- The Geometry Column.
s_r_b
Интересующийся
Сообщения: 31
Зарегистрирован: 08 авг 2011, 15:25
Репутация: 0

Re: как выделить объект на карте цветом?

Сообщение s_r_b »

спасибо, пробую
s_r_b
Интересующийся
Сообщения: 31
Зарегистрирован: 08 авг 2011, 15:25
Репутация: 0

Re: как выделить объект на карте цветом?

Сообщение s_r_b »

спасибо большое. разобрался
s_r_b
Интересующийся
Сообщения: 31
Зарегистрирован: 08 авг 2011, 15:25
Репутация: 0

Re: как выделить объект на карте цветом?

Сообщение s_r_b »

разобрался да не совсем.
если написать - ...FILTER (gid=400).... то объект будет нарисован
а если передаю из запроса - .......FILTER (gid=%SQL%)....... то рисуются красные квадраты на всю карту.
firebug говорит
Resource interpreted as Image but transferred with MIME type text/html: "http://localhost:8080/cgi-bin/mapserv.e ... xy=256+256".
OpenLayers.Tile.Image.OpenLayers.Class.positionImageImage.js:336
OpenLayers.Tile.Image.OpenLayers.Class.renderTileImage.js:308
OpenLayers.Tile.Image.OpenLayers.Class.drawImage.js:237
OpenLayers.Layer.Grid.OpenLayers.Class.spiralTileLoadGrid.js:513
OpenLayers.Layer.Grid.OpenLayers.Class.initGriddedTilesGrid.js:431
OpenLayers.Layer.Grid.OpenLayers.Class.moveToGrid.js:192
OpenLayers.Layer.OpenLayers.Class.redrawLayer.js:527
OpenLayers.Layer.HTTPRequest.OpenLayers.Class.redrawHTTPRequest.js:149
OpenLayers.Map.OpenLayers.Class.addLayerMap.js:941
(anonymous function)
и таких 8 штук.
в запросе слоя пишу

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

var highlight = new OpenLayers.Layer.MapServer("Highlighting",
                            mapsrvpath,
                            {'map': mappath,layers:'highlights', format:'image/png', SQL:400},
                            {isBaseLayer:false, visibility:true, opacity:0.5, transparent:true }
    );
    map.addLayer(highlight);
в карте
LAYER
NAME "highlights"
STATUS on
TYPE polygon
CONNECTIONTYPE postgis
CONNECTION "user=postgres password=postgres dbname=postgis host=localhost"
DATA "the_geom from (select * from zemlepol_2_region) as newtable using unique gid using srid=4326"
PROCESSING "CLOSE_CONNECTION=DEFER"
FILTER (gid=%SQL%)
PROJECTION
"init=epsg:4326"
END

CLASS
STYLE
COLOR 229 60 54
OUTLINECOLOR 188 0 0
END
END
END
Так как же правильно передать параметр в .map файл?
Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: как выделить объект на карте цветом?

Сообщение Denis Rykov »

Нужно вставить строку сгенерированного запроса в браузер и посмотреть на что ругается мапсервер.
Spatial is now, more than ever, just another column- The Geometry Column.
s_r_b
Интересующийся
Сообщения: 31
Зарегистрирован: 08 авг 2011, 15:25
Репутация: 0

Re: как выделить объект на карте цветом?

Сообщение s_r_b »

вот запрос из firebug

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

http://localhost:8080/cgi-bin/mapserv.exe?map=C%3A%2Fms4w%2FApache%2Fhtdocs%2Fsite%2Fmaps%2Fw.map&layers=highlights&format=image%2Fpng&SQL=400&mode=map&map_imagetype=png&mapext=8049.0566037736+-10000+17065.408805031+-983.64779874214&imgext=8049.0566037736+-10000+17065.408805031+-983.64779874214&map_size=256+256&imgx=128&imgy=128&imgxy=256+256
вот ответ mapservera

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

msDrawMap(): Image handling error. Failed to draw layer named 'highlights'. msPostGISLayerWhichShapes(): Query error. Error (ERROR: syntax error at or near ")" LINE 1: ...ind_srid('','zemlepol_2_region','the_geom')) and (gid=%SQL%) ^ ) executing query: select encode(ST_AsBinary(ST_Force_2D("the_geom"),'NDR'),'hex') as geom,"gid" from zemlepol_2_region where the_geom && GeomFromText('POLYGON((8049.05660377337 -10000,8049.05660377337 -983.64779874214,17065.4088050312 -983.64779874214,17065.4088050312 -10000,8049.05660377337 -10000))',find_srid('','zemlepol_2_region','the_geom')) and (gid=%SQL%) msValidateParameter(): Regular expression error. Parameter pattern validation failed. msValidateParameter(): Regular expression error. Parameter pattern validation failed. msValidateParameter(): Regular expression error. Parameter pattern validation failed. msValidateParameter(): Regular expression error. Parameter pattern validation failed. msValidateParameter(): Regular expression error. Parameter pattern validation failed. msValidateParameter(): Regular expression error. Parameter pattern validation failed. msValidateParameter(): Regular expression error. Parameter pattern validation failed. msValidateParameter(): Regular expression error. Parameter pattern validation failed. msValidateParameter(): Regular expression error. Parameter pattern validation failed. msValidateParameter(): Regular expression error. Parameter pattern validation failed. msValidateParameter(): Regular expression error. Parameter pattern validation failed. msValidateParameter(): Regular expression error. Parameter pattern validation failed. msValidateParameter(): Regular expression error. Parameter pattern validation failed.
чтоб это значило
native
Интересующийся
Сообщения: 26
Зарегистрирован: 09 ноя 2011, 14:02
Репутация: 0

Re: как выделить объект на карте цветом?

Сообщение native »

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

new OpenLayers.Feature.Vector(OpenLayers.Geometry.fromWKT(
    "POLYGON((80.363552 52.935941,84.055363 53.00, 84.055363 51.976070))"
)
Как вместо 80.363552 52.935941,84.055363 53.00, 84.055363 51.976070 получить и вставить координаты в формате WKT как раз того объекта, по которому кликаем мышью?
Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: как выделить объект на карте цветом?

Сообщение Denis Rykov »

native писал(а):

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

new OpenLayers.Feature.Vector(OpenLayers.Geometry.fromWKT(
    "POLYGON((80.363552 52.935941,84.055363 53.00, 84.055363 51.976070))"
)
Как вместо 80.363552 52.935941,84.055363 53.00, 84.055363 51.976070 получить и вставить координаты в формате WKT как раз того объекта, по которому кликаем мышью?
В зависимости от того каким образом вы выбираете объект по клику. В любом случае нужно сначала получить свойство geometry фичи, а затем вызвать метод toString().
Spatial is now, more than ever, just another column- The Geometry Column.
native
Интересующийся
Сообщения: 26
Зарегистрирован: 09 ноя 2011, 14:02
Репутация: 0

Re: как выделить объект на карте цветом?

Сообщение native »

функция такая

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

var click_ctrl = new OpenLayers.Control.WMSGetFeatureInfo({
    url: "http://localhost/cgi-bin/mapserv.exe?map=/ms4w/apps/newp1/maps1.map",
    layers: [wms2],
    queryVisible: true,
    infoFormat: 'application/vnd.ogc.gml',
    autoActivate: true,
    vendorParams: {radius: 10 },
    eventListeners: {
        'getfeatureinfo': function(e) {
           showInfo(e);
           console.log(e.text); 
           pointlayer.removeAllFeatures(pointlayer);
           pointlayer.addFeatures([
OpenLayers.Geometry.Point(84, 54), map.getResolution(), 60, 0))
	new OpenLayers.Feature.Vector(OpenLayers.Geometry.fromWKT(
                    "POLYGON((80.363552 52.935941,84.055363 53.00, 84.055363 51.976070))"
                )
)
]);
    tracklayer = new OpenLayers.Layer.PointTrack('track', {styleFrom: OpenLayers.Layer.PointTrack.SOURCE_NODE});
    tracklayer.addNodes(pointlayer.features); 
    map.addLayer(pointlayer);
        }
	}
});
Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: как выделить объект на карте цветом?

Сообщение Denis Rykov »

Не смог распарсить ваш код, в нём явно какие-то синтаксические ошибки. Опишите словами чего вы хотите.
Spatial is now, more than ever, just another column- The Geometry Column.
native
Интересующийся
Сообщения: 26
Зарегистрирован: 09 ноя 2011, 14:02
Репутация: 0

Re: как выделить объект на карте цветом?

Сообщение native »

Продолжаю из этой темы. Поверх wms слоя по клику на объекте рисуем векторный объект такой же формы, получается что-то типа наложения. Вот мне и нужны координаты объекта, чтобы нарисовать его на векторном слое. Возможен же такой вариант для выделения?

Полностью код страницы:

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

<html>
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
  <title>OpenLayers BLG</title>
  <script src="http://localhost/openlayers-2.10/OpenLayers.js"></script>
  <script type="text/javascript">
function init(){
function showInfo(e) {
       var popup = new OpenLayers.Popup.FramedCloud("popup",
                   map.getLonLatFromPixel(e.xy),
                   new OpenLayers.Size(200,200),
                   e.xy,
                   null,
                   true
                );
       map.addPopup(popup);
    }	  

var map = new OpenLayers.Map('map',{maxExtent: new OpenLayers.Bounds(77.462843, 46.986851, 94.835452, 55.562401)});    
var wms1 = new OpenLayers.Layer.WMS( "Границы", "http://localhost/cgi-bin/mapserv.exe?map=/ms4w/apps/newp1/maps1.map",{layers: 'admin', visibility: true, transparent: true}, {opacity: .7});
var wms2 = new OpenLayers.Layer.WMS( "OpenLayers MapServer", "http://localhost/cgi-bin/mapserv.exe?map=/ms4w/apps/newp1/maps1.map",{layers: 'my1shp', visibility: true},{isBaseLayer: true});    


var pointlayer = new OpenLayers.Layer.Vector('Original');
var click_ctrl = new OpenLayers.Control.WMSGetFeatureInfo({
    url: "http://localhost/cgi-bin/mapserv.exe?map=/ms4w/apps/newp1/maps1.map",
    layers: [wms2],
    queryVisible: true,
    infoFormat: 'application/vnd.ogc.gml',
    autoActivate: true,
    vendorParams: {radius: 10 },
eventListeners: {
        'getfeatureinfo': function(e) {
            showInfo(e);
		console.log(e.text); 
pointlayer.removeAllFeatures(pointlayer);
pointlayer.addFeatures([
        //new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(map.getLonLatFromPixel(e.xy))),
        //new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(85, 55)),
	 // new OpenLayers.Feature.Vector(OpenLayers.Geometry.Polygon.createRegularPolygon(new OpenLayers.Geometry.Point(84, 54), map.getResolution(), 60, 0))
	new OpenLayers.Feature.Vector(OpenLayers.Geometry.fromWKT(
                    "POLYGON((80.363552 52.935941,84.055363 53.00, 84.055363 51.976070))"
                )
)
]);

    tracklayer = new OpenLayers.Layer.PointTrack('track', {styleFrom: OpenLayers.Layer.PointTrack.SOURCE_NODE});
    tracklayer.addNodes(pointlayer.features); 
    map.addLayer(pointlayer);
        }
	}
});

            var report = function(e) {
                OpenLayers.Console.log(e.type, e.feature.id);
            };

var highlightCtrl = new OpenLayers.Control.SelectFeature(pointlayer, {
                hover: true,
                highlightOnly: true,
                renderIntent: "temporary",
                eventListeners: {
                    beforefeaturehighlighted: report,
                    featurehighlighted: report,
                    featureunhighlighted: report
                }
            });

            var selectCtrl = new OpenLayers.Control.SelectFeature(pointlayer,
                {clickout: true}
            );

            map.addControl(highlightCtrl);
            map.addControl(selectCtrl);

            highlightCtrl.activate();
            selectCtrl.activate();
          
map.addLayers([wms2, wms1, pointlayer]); 

// vectors.addFeatures([feature]);

map.addControl(new OpenLayers.Control.LayerSwitcher());
map.zoomToMaxExtent();

// горячие клавиши
      map.addControl(new OpenLayers.Control.KeyboardDefaults());
  
      // координаты текущего положения мыши
      map.addControl(new OpenLayers.Control.MousePosition());

map.addControl(click_ctrl);
//map.addControl(new OpenLayers.Control.CustomNavToolbar());
}

</script>
</head>
    <body onload="init()">
      <div style="width:80%; height:80%" id="map"></div>    
</body>
</html>
Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: как выделить объект на карте цветом?

Сообщение Denis Rykov »

Похожий вопрос возникал в другой теме - посмотрите, я там ответил.
Spatial is now, more than ever, just another column- The Geometry Column.
native
Интересующийся
Сообщения: 26
Зарегистрирован: 09 ноя 2011, 14:02
Репутация: 0

Re: как выделить объект на карте цветом?

Сообщение native »

Какое условие написать чтобы при нажатии на пустую область, т.е. не на объект, ничего не происходило?
Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: как выделить объект на карте цветом?

Сообщение Denis Rykov »

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

'getfeatureinfo': function(e) {
    if (e.features.length) {
        #your stuff
    }
}
Spatial is now, more than ever, just another column- The Geometry Column.
Ответить

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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя