Hey Hans,

Thanks so much for taking a close look at this and providing a patch.  
There are many other devs and users more familiar with the PostGIS  
implementation than I, but I will say that there is a lot of current  
activity and thoughts about improving the flexibility of the driver.

I'd encourage you to take a look at the other tickets:

http://trac.mapnik.org/query?status=assigned&status=new&status=reopened&component=PostGIS+Input+Driver&order=priority&col=id&col=summary&col=status&col=type&col=priority&col=milestone&col=component

And particularly this thread: 
http://www.nabble.com/Odd-behavior-with-PostGIS-tc23983405.html

And either attach your patch to the most appropriate ticket or create  
a new one.

Thanks,

Dane


On Jul 17, 2009, at 3:31 AM, Hans Musil wrote:

> Hi, I'm one of the technical admins of Wikivoyage, a free open  
> content wiki based travel guide. We have plans to make extensive use  
> of Mapnik together - but not only - with OSM data. The table layout  
> of the PostGIS backend will be completely different from what OSM's  
> osm2pgsql generates.
>
> Oh, yes - and I don't like mailing lists. I only will keep  
> subscribed for some days in order to follow the discussion. You  
> always can drop me a message on my Wikivoyage user talk page 
> http://www.wikivoyage.org/de/Benutzer:Hansm
>
> As I have seen from the source code, Mapnik makes a *very*  
> simplistic guess about the PostgreSQL table and schema that hold the  
> actual geometry column. If queries given as parameter  
> "table" (actually a bad name) get a little bit more complex, Mapnik  
> fails terribly. However, it's not worth to improve this guess since  
> queries may be really complex. Instead, I wanted to propose two  
> additional optional paramters for postgis_datasource: "table_name"  
> and "schema_name". Both are used for retrieving the SRID and the  
> geometry field (if not given as parameter). The SRID itself is  
> needed for estimating the extend of the table's geometries.
>
> Here is an example for parameter "table", that is too complex for  
> Mapnik (it guesses osm_relation_mb to be the geometry table):
>
> <Parameter name="table">(SELECT way FROM osm_way WHERE osm_id = ANY  
> (SELECT rm_way FROM osm_relation_mb WHERE rm_relation=62149)) as  
> border</Parameter>
>
> I have added two patches, one for plugins/input/postgis/postgis.cpp  
> and one for the corresponding header file. Both refere to the up to  
> date svn version.
>
> Cheers,
>
> Hans
>
> --- mapnik-0.6.1/plugins/input/postgis/postgis.cpp    2009-07-14  
> 11:08:55.000000000 +0200
> +++ mapnik-0.6.1-patched/plugins/input/postgis/postgis.cpp     
> 2009-07-17 11:39:44.000000000 +0200
> @@ -82,6 +82,9 @@
>
>    multiple_geometries_ =  
> *params_.get<mapnik::boolean>("multiple_geometries",false);
>
> +   schema_name_ = *params.get<std::string>("schema_name","");
> +   table_name_  = *params.get<std::string>("table_name","");
> +
>    boost::optional<std::string> ext  =  
> params_.get<std::string>("extent");
>    if (ext)
>    {
> @@ -130,25 +133,32 @@
>
>          desc_.set_encoding(conn->client_encoding());
>
> -         std::string table_name=table_from_sql(table_);
> -         std::string schema_name="";
> -         std::string::size_type idx=table_name.find_last_of('.');
> +         if (table_name_.length()==0)
> +         {
> +           table_name_=table_from_sql(table_);
> +           std::string::size_type idx=table_name_.find_last_of('.');
>          if (idx!=std::string::npos)
>          {
> -            schema_name=table_name.substr(0,idx);
> -            table_name=table_name.substr(idx+1);
> +              if (schema_name_.length()==0)
> +              {
> +                schema_name_=table_name_.substr(0,idx);
> +              };
> +              table_name_ =table_name_.substr(idx+1);
>          }
>          else
>          {
> -            table_name=table_name.substr(0);
> +              table_name_=table_name_.substr(0);
>          }
> +         };
> +
> +         geometryColumn_=geometry_field_;
>
>          std::ostringstream s;
>          s << "select f_geometry_column,srid,type from ";
> -         s << GEOMETRY_COLUMNS <<" where f_table_name='" <<  
> table_name<<"'";
> +         s << GEOMETRY_COLUMNS <<" where f_table_name='" <<  
> table_name_<<"'";
>
> -         if (schema_name.length() > 0)
> -            s <<" and f_table_schema='"<< schema_name <<"'";
> +         if (schema_name_.length() > 0)
> +            s <<" and f_table_schema='"<< schema_name_ <<"'";
>
>          if (geometry_field_.length() > 0)
>             s << " and f_geometry_column = '" << geometry_field_ <<  
> "'";
> @@ -361,21 +371,20 @@
>       {
>           
> PoolGuard 
> < 
> shared_ptr<Connection>,shared_ptr<Pool<Connection,ConnectionCreator>  
> > > guard(conn,pool);
>          std::ostringstream s;
> -         std::string table_name = table_from_sql(table_);
>          boost::optional<std::string> estimate_extent =  
> params_.get<std::string>("estimate_extent");
>
>          if (estimate_extent && *estimate_extent == "true")
>          {
>             s << "select xmin(ext),ymin(ext),xmax(ext),ymax(ext)"
>               << " from (select estimated_extent('"
> -              << table_name <<"','"
> +              << table_name_ <<"','"
>               << geometryColumn_ << "') as ext) as tmp";
>          }
>          else
>          {
>             s << "select xmin(ext),ymin(ext),xmax(ext),ymax(ext)"
>               << " from (select extent(" <<geometryColumn_<< ") as  
> ext from "
> -              << table_name << ") as tmp";
> +              << table_name_ << ") as tmp";
>          }
>
>          shared_ptr<ResultSet> rs=conn->executeQuery(s.str());
> --- mapnik-0.6.1/plugins/input/postgis/postgis.hpp    2009-07-14  
> 11:08:55.000000000 +0200
> +++ mapnik-0.6.1-patched/plugins/input/postgis/postgis.hpp     
> 2009-07-17 11:40:42.000000000 +0200
> @@ -1,3 +1,4 @@
> +
> / 
> *****************************************************************************
>  *
>  * This file is part of Mapnik (c++ mapping toolkit)
> @@ -60,6 +61,8 @@
>       const std::string geometry_field_;
>       const int cursor_fetch_size_;
>       const int row_limit_;
> +      std::string schema_name_;
> +      std::string table_name_;
>       std::string geometryColumn_;
>       int type_;
>       int srid_;
> _______________________________________________
> Mapnik-devel mailing list
> [email protected]
> https://lists.berlios.de/mailman/listinfo/mapnik-devel

_______________________________________________
Mapnik-devel mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/mapnik-devel

Reply via email to