[OpenLayers-Users] Another GetFeatureWFS & (Possible) Proxy Issue - CONTENT_LENGTH

Chris Dpont dupes9999 at hotmail.com
Sat May 8 19:39:31 EDT 2010


Hi All,

I apologize in advance if this question is already answered in a previous
post. I have looked through many GetFeatureWFS (and proxy.cgi) related posts
and have not found a solution to my problem as of yet - and it doesn't help
that my coding skills have gone stale - so here goes....

I've been fiddling with the Openlayers WFS GetFeature capabilities for a
little while, but have been having a hard time getting any results from it.
At first, Firebug was giving me a lot of errors when I tried to select or
hover over features, but I quickly found out about the need for the
ProxyHost, and have downloaded the proxy.cgi from the Openlayers site and
placed it in my /cgi-bin/ folder. After a lot of work with it, I believe I
finally have that working - it's properly opening when directly referenced
(though It could still be failing for other purposes). 

Now when I try to select features from my map, I'm no longer getting any
'red errors' in Firebug, but nothing is being selected and I'm still seeing
some error messages (though no longer red) pop up in Firebug. The query
appears to be sent to the server, but this is what is coming up as the
response:

Some unexpected error occurred. Error text was: 'CONTENT_LENGTH'

Now, I'm guessing that I have something wrong with either my js or my proxy
(or even possibly my mapfile), but I can't seem to find where the problem
is. Anybody  have any ideas?

As for the environment details:

I'm currently running my website on a Ubuntu 8.04 machine with Apache
version 2.2, and am referencing the newest version of OpenLayers from their
site. I will post the web and proxy code below, but if someone wants to play
in my sandbox, please go right ahead : 
http://www.cemetermaps.ca/Simpletest.html
www.cemeterymaps.ca/Simpletest.html . It only appears to work for Firefox
right now - not IE. That's a completely separate issue that I will tackle
later on .

Any help would be appreciated - please let me know if you have any
clarification questions for me.

Thanks,

Chris


CODE

Website code -- -----------------

	 
 	<html xmlns="http://www.w3.org/1999/xhtml">
 	  <head>
	<link rel="stylesheet"
href="http://openlayers.org/api/theme/default/style.css" type="text/css" />

 	    <style type="text/css">
 	        #map {
 	            width: 640px;
	            height: 480px;
	            border: 1px solid black;
 	        }
		div.olControlScaleLine {
			color: black;
			font-family: Arial;
			font-size: 0.8em;
			background-color: white;
			}

	    </style>
 	    <script src="http://openlayers.org/api/OpenLayers.js"></script> <!--
/OpenLayers.js"></script> -->
 	    <script type="text/javascript">
 	        <!--
 	        var map, scaleline, cemlayer, photoLayer, vectorLayer, select,
hover, control;

 	        function init(){

		OpenLayers.ProxyHost = "/cgi-bin/proxy.cgi?url=";

 	            map = new OpenLayers.Map('map', {maxExtent: new
OpenLayers.Bounds(570745.457020642, 4843274.70626104, 570993.457787,
4843505.93442523), maxResolution: 0.5, units: 'm', projection: "EPSG:32617",
isbaselayer:false, numZoomLevels: 10, tileSize: new OpenLayers.Size(0.005,
0.005)});//new OpenLayers.Map('map'); 156543

			var bounds = new OpenLayers.Bounds(); //-80.121444 43.739134 -80.118334
43.741192 
			bounds.left = 570745.457020642; //-80.121444; //
			bounds.bottom = 4843274.70626104; //43.739134; //
			bounds.right = 570993.457787; //-80.118334; //
			bounds.top = 4843505.93442523; //43.741192; //

		map.setOptions({restrictedExtent: bounds}); //Sets it so you can't zoom or
pan off of the map surface
		scaleline = new OpenLayers.Control.ScaleLine({maxWidth: 100}); //creates
the scale line

		cemlayer = new OpenLayers.Layer.WMS( "Coningsby Test",
                   
"http://192.168.1.66/cgi-bin/mapserv?map=%2F%2Fhome%2Fchris%2FCemeterySite%2Fmapdata%2Fconingsby_test.map&SERVICE=WMS&VERSION=1.1.1&REQUEST=&REQUEST=GetMap&LAYERS=Cem_Photo,coningsby&STYLES=&SRS=EPSG:32617&FORMAT=image/png",
{layers: 'Cem_Photo,Coningsby'}, {singleTile: true}, {maxExtent: bounds},
{units: 'm'}, {isBaseLayer: true}); //WORKING - doesn't need the image size
or bounds in the connection string


 	select = new OpenLayers.Layer.Vector("Selection", {styleMap: 
                new
OpenLayers.Style(OpenLayers.Feature.Vector.style["select"])
            });
            hover = new OpenLayers.Layer.Vector("Hover");
                
            control = new OpenLayers.Control.GetFeature({
               protocol: OpenLayers.Protocol.WFS.fromWMSLayer(cemlayer), 
                box: true,
                hover: true,
                multipleKey: "ctrlKey",
                toggleKey: "altKey"
            });
		//alert("Message1!");

            control.events.register("featureselected", this, function(e) {
                select.addFeatures([e.feature]);
		//alert("Message2!");
            });
           control.events.register("featureunselected", this, function(e) {
                select.removeFeatures([e.feature]);
		//alert("Message3!");
            });
            control.events.register("hoverfeature", this, function(e) {
                hover.addFeatures([e.feature]);
		//alert("Message4!");
            });
            control.events.register("outfeature", this, function(e) {
                hover.removeFeatures([e.feature]);
		//alert("Message5!");
            });

		    //map.addLayer(photoLayer);
	            map.addLayer(cemlayer);
		    map.addLayers([hover, select]);
		    map.addControl(scaleline); //adds the scaleline
		    map.addControl(new OpenLayers.Control.LayerSwitcher());
		    map.addControl(control); //Adds the GetFeature material
		    control.activate();
		    map.zoomToExtent(bounds); //Will zoom to the 'area' of the cemetery
when using dd instead of UTM	
	        }
 	         -->
 	    </script>
 	  </head>
	  <body onload="init()">
	    <div id="map"></div>
	    <div id="scaleline"></div>
	  </body>

 	</html>

------------------------Proxy.cgi Code --------------------------------

#!/usr/bin/env python
 	
import urllib2
import cgi
import sys, os
 	
# Designed to prevent Open Proxy type stuff.
 	
allowedHosts = ['www.openlayers.org', 'openlayers.org',
'labs.metacarta.com', 'world.freemap.in', 'prototype.openmnnd.org',
'geo.openplans.org', 'sigma.openplans.org', 'demo.opengeo.org',
'www.openstreetmap.org', 'www.cemeterymaps.ca', '192.168.1.66']

method = os.environ["REQUEST_METHOD"]

if method == "POST":
	qs = os.environ["REQUEST_METHOD"]
	d = cgi.parse_qs(qs)
	if d.has_key("url"):
		url = d["url"][0]
	else:
		url = "http://www.openlayers.org"
else:
	fs = cgi.FieldStorage();
	url = fs.getvalue('url', "http://www.openlayers.org")
 	
try:
	host = url.split("/")[2] #Gets rid of the http or https
	if allowedHosts and not host in allowedHosts:
		print "Status: 502 Bad Gateway"
		print "Content-Type: text/plain"
		print
		print "This proxy does not allow you to access that location (%s)." %
(host,)
		print
		print os.environ
 	 
	elif url.startswith("http://") or url.startswith("https://"):
 	   
		if method == "POST":
			length = int(os.environ["CONTENT_LENGTH"])
			headers = {"Content-type": os.environ["CONTENT_TYPE"]}
			body = sys.stdin.read(length)
			r = urllib2.Request(url, body, headers)
			y = urllib2.urlopen(r)
		else:
			y = urllib2.urlopen(url)
 	       
		# print content type header
		i = y.info()
		if i.has_key("Content-type"):
			print "Content-type: %s" % (i["Content-type"])
			print y.read()
			y.close()
		else:
			print "Content-type: text/plain\n\n"
			print
			print y.read()
			y.close()
	else:
		print "Content-type: text/plain\n\n"
		print
		print "Illegal request."

except Exception, E:
	print "Status: 500 Unexpected Error"
	print "Content-type: text/plain\n\n"
	print
	print "Some unexpected error occurred. Error text was:", E
-- 
View this message in context: http://osgeo-org.1803224.n2.nabble.com/Another-GetFeatureWFS-Possible-Proxy-Issue-CONTENT-LENGTH-tp5024916p5024916.html
Sent from the OpenLayers Users mailing list archive at Nabble.com.



More information about the Users mailing list