How to make a polygon with a hole - postgis

I'm using postgresSQL with postgis and I'm trying to create a polygon with a hole. I read a lot of users asking for something similar, but I can't do it for myself. My code is
insert into distritos(nombre,geom) values ('Distrito6',ST_MakePolygon(ST_GeomFromText('LINESTRING((-15.66486 27.91996, -15.60610 27.91820, -15.60359 27.97169, -15.66586 27.97144,-15.66486 27.91996),(-15.65753 27.95894, -15.61610 27.95995, -15.61459 27.93157, -15.65477 27.27.93007,-15.65753 27.95894))',4258)));
but it doesn't work. What do I have to do?

A Polygon has a double parenthesis at the start and end, and inner rings are delineated by using single pairs of parenthesis, between commas, ie, ),( whereas a Linestring only has one set of parenthesis at the beginning and end. You are actually using the syntax for a MultiLinestring, which is probably where your issue is. You can fix you query like this:
insert into distritos(nombre, geom) values
('Distrito6', ST_GeomFromText('POLYGON((-15.66486 27.91996,
-15.60610 27.91820, -15.60359 27.97169, -15.66586 27.97144,-15.66486 27.91996),
(-15.65753 27.95894, -15.61610 27.95995, -15.61459 27.93157,
-15.65477 27.93007,-15.65753 27.95894))',4258));
Also, you do not need to use ST_MakePolygon, as if you are using ST_GeomFromText, you can create the polygon directly by using POLYGON instead of LINESTRING in your example above. ST_MakePolygon is probably more useful when you have arrays of Linestrings representing inner rings.
The Wikipedia WKT article details this very clearly, with WKT and accompanying graphics.
NOTE: You also have an error in you linestring, you have a repeated 27. in 27.27.93007.

Related

Identify all strings in SQL Server code (red color - like in SSMS)

I was not able to solve this by myself so I hope I didn't miss any similar post here and I'm not wasting your time.
What I want is to identify (get a list) of all strings used in SQL Server code.
Example:
select 'WordToCatch1' as 'Column1'
from Table1
where Column2 = 'WordToCatch2'
If you put above code to SSMS all three words in apostrophes will be red but only words 'WordToCatch1' and 'WordToCatch2' are "real" strings used in code.
My goal is to find all those "real" strings in any code.
For example if I will have stored procedure 10k rows long it would be impossible to search them manually so I want something what will find all those "real" strings for me and return a list of them or something.
Thanks in advance!
The trouble is, Column1 is nothing particular different compared to WordToCatch1 and WordToCatch2 - not unless you parse the SQL yourself. You could modify your query to take the quotes away from Column1 and it will show up coloured black.
I guess a simple regex will show up all identifiers after an AS keyword, which would be easier than fully parsing SQL, if all the unwanted strings are like that, and its not just an example.

Point in polygon algorithm for SQL Server

I'm trying to write a SQL query which determine if a given point is into a polygon. (I'm using SQL Server 2008 R2).
I was following this tutorial (just copy / paste it and change some table name) and it approximatively works BUT it is not precise at all. For example, let's considerate a given point which coordinates are :
P = 45.7664, 4.87383.
If you draw a little polygon (an approximate square) around this point with 4 vertices coordinates :
S = 45.97215 4.693909, 45.687 4.674683, 45.73302 5.460205, 46.05227 5.366821, 45.97215 4.693909
the procedure given in the link below answers the point is NOT in polygon, whereas it is...
This is the output (with my own formatting text) :
(Polygon 20 is the polygon above)
But if you enlarged the square (10 times bigger in my test), the procedure answers my point is in the square.
So, I'm seeking for another algorithm, more precise.
Here is my VERTICE table, containing all vertices coordinates of each polygon of my DB
I need to check, for ALL polygons (there are a few thousands) if a given point passed in parameter is in a polygon (and if yes, which one(s)). I can do the loop by myself, but I miss a correct Point in polygon algorithm.
Could someone help me ?
Thank you very much.
SUMMARY
The corresponding SQL fiddle : http://sqlfiddle.com/#!3/0caa4/1
Your problem is that you've defined the polygon backwards. Let's explore this with the native SQL geography types
declare #s geography, #t geography, #p geography;
select #s = geography::STPolyFromText('POLYGON((45.97215 4.693909, 45.687 4.674683, 45.73302 5.460205, 46.05227 5.366821, 45.97215 4.693909))', 4326);
select #t = geography::STPolyFromText('POLYGON((46.05227 5.366821, 45.73302 5.460205, 45.687 4.674683, 45.97215 4.693909, 46.05227 5.366821))', 4326);
select #p = geography::STPointFromText('POINT(45.7664 4.87383)', 4326);
select #p.STIntersects(#s), #p.STIntersects(#t);
select #p.STBuffer(10), #s, #t;
As you can see, #s holds pretty much the whole world. In the result set viewer, if you zoom into where your "square" should be, you'll find a hole. Contrast that with #t which is the area that you expect. Also note that I ran this in SQL 2012 which improved on a limitation that existed pre-2012 that says that a geospatial instance can't cross a hemisphere boundary. If you run the above on a 2008 instance, you'll likely get an error to that effect for #s. Comment out the line defining #s and it'll run.
There's a "right-hand" rule when defining geo(graphy/metry) polygons. Imagine that you were in a car visiting the points in the order you've specified. The area that you're defining is what you'd see if you were looking out the right side of the car.

Get intersecting lines in sql spatial

I'm using Entity Framework 5.0 and sql server geometry type.
I'm trying to take a point and find the lines that intersect a buffer of that point and meet certain attribute requirements. Is this possible?
I know of the STIntersect method but those appear to work as a comparison between two features. I have a line dataset and a single point. so i don't know how many results i could get.
You can use the STBuffer geometry method to get an area around a point and store that in a variable (or wherever!). From there, you can use STIntersects to find out if your lines. Like so:
DECLARE #g geometry, #l geometry;
SELECT #g = geometry::STGeomFromText('POINT(0 0)', 0),
#l = geometry::STGeomFromText('LINESTRING(0 1, 4 0)', 0);
SELECT #g, #l, #g.STBuffer(1), #l.STIntersects(#g.STBuffer(1));
Also, my standard caveat of using the right data type (geography vs geometry) applies if you're doing geospatial.

Print values on Paraview from C

and I need help (again).
My problem is as follow:
1.- I need to print the values of a volume using ParaView.
2.- I save the values with coordinates and intensities and a file .Csv.
i,j,k,Intensity
0,0,0,0.000000
0,1,0,0.000000
0,2,0,0.000000
0,3,0,0.000000
0,4,0,0.000000
0,5,0,0.000000
etc...
3.- But What I get is:
4.- I know Paraview use a lot of format, but I need to print the values of volume with data obtained from language C(not c++).
5.- Finally the true question... Can I use this kind of file (csv) to print a volume or I need to change to other? Because I don't have idea how to make RAW o TVK... can you help me please?
Ivan.
Ivan, I am not to sure if I understand you but you can use the
"Table To Structured Grid" filter, then you can represent it as a Volume and color by the intensity scalar field.

how to get the index of a point from geography?

How can i get the index of a point which is in my LineString?
I am using SQL Server 2008 R2.
I do have a geography type where a LineString is saved in.
I want now to get the index of two points on this LineString. So that I know which one occurs first.
Is this somehow possible?
Because right now i'm doing it for my self with a while loop... but it's really slow when i've got some more data in my database :/
EDIT: Ok, right now i'm trying to follow the solution from SQL to use CHARINDEX.
Some more background info:
I do have a geo point, I do have a linestring. I did get the intersecting points with a radius around my point from the linestring. Ok, now i want to try to get with the first intersecting point the index from this point on the LineString.
So i do have in my linestring some numbers like these patterns "1.123456 or 12.123456 or 123.123456" and my search point is also something like "1.123456 or 12.123456 or 123.123456"
The Problem is, that STIntersection gives me some different numbers back which are variable at the fractional digits. I thought about some string formatting, but i don't know how i should solve this. If there would be some nice regex features i think it would make my life easyier :)
I had a look through all of these functions but couldn't find anything for my needs.
Maybe some more experienced people could help me with that.
Thanks!
In case the datatype is varchar used. Please see below.
You can use CharIndex
DECLARE #document varchar(64)
SELECT #document = 'abcdef12345wuerzelchen'
SELECT CHARINDEX('abc', #document)
Once you have got the first occurrence point, Now you can check for another.
Declare #position int
Set #position = CHARINDEX('abc', #document)
SELECT CHARINDEX('wuerzelchen', #document, #position)
For more information you can check here

Resources