我有一个详细的2D多边形(代表一个地理区域),它由一组非常大的顶点定义.我正在寻找一种算法,它将简化和平滑多边形(减少顶点的数量),其约束条件是生成的多边形的区域必须包含详细多边形的所有顶点.
对于上下文,这是一个复杂多边形边缘的示例:
我的研究:
我找到了Ramer-Douglas-Peucker算法,它将减少顶点的数量 - 但生成的多边形将不包含所有原始多边形的顶点.请参阅维基百科上的这篇文章Ramer-Douglas-Peucker
我考虑过扩展多边形(我相信这也称为向外多边形偏移).我发现了以下问题:扩展多边形(仅凸面)和膨胀多边形.但我不认为这会大大减少我的多边形的细节.
感谢您给我的任何建议!
我正在尝试将一堆纬度/经度对加载到PostGIS地理类型中,以便能够按位置进行查询.
特别是我有一个浮动纬度和经度列和一geography(Point, 4326)
列的表.我想要做
update mytable set geography = ???
Run Code Online (Sandbox Code Playgroud)
文档似乎表明以下内容应该有效:
update mytable set geography = ST_GeogFromText('POINT(' || latitude || ' ' ||
longitude || ')');
Run Code Online (Sandbox Code Playgroud)
它没有.我不知道它是什么意思解释这一点,但它只允许经度介于-90和90之间,所以它显然不是经度.
那么,我该怎么办?
这是一个挑战问题,而不是我迫切需要的东西,所以不要整天花在它们身上.
我在2000年左右建立了一个约会网站(早已不复存在),其中一个挑战是计算用户之间的距离,以便我们可以在半径X英里内展示您的"匹配".为了说明问题,给定以下数据库模式(粗略地):
USER TABLE UserId UserName ZipCode
ZIPCODE表ZipCode纬度经度
USER和ZIPCODE加入USER.ZipCode = ZIPCODE.ZipCode.
您将采取什么方法来回答以下问题:在给定用户的邮政编码的X英里范围内的其他用户使用的邮政编码.
我们使用了2000年人口普查数据,其中包含邮政编码表及其近似的经纬度.
我们还使用Haversine公式来计算球体上任意两点之间的距离......非常简单的数学.
至少对我们来说,这个问题是我们19岁的大学生,真正成为了如何有效地计算和/存储从所有成员到所有其他成员的距离.一种方法(我们使用的方法)是导入所有数据并计算从每个邮政编码到每个其他邮政编码的距离.然后,您将存储并索引结果.就像是:
SELECT User.UserId
FROM ZipCode AS MyZipCode
INNER JOIN ZipDistance ON MyZipCode.ZipCode = ZipDistance.MyZipCode
INNER JOIN ZipCode AS TheirZipCode ON ZipDistance.OtherZipCode = TheirZipCode.ZipCode
INNER JOIN User AS User ON TheirZipCode.ZipCode = User.ZipCode
WHERE ( MyZipCode.ZipCode = 75044 )
AND ( ZipDistance.Distance < 50 )
Run Code Online (Sandbox Code Playgroud)
当然,问题是ZipDistance表中会有很多行.它并非完全不可行,但它确实很大.此外,它需要对整个数据集进行完整的预处理,这也不是无法管理的,但不一定是可取的.
无论如何,我想知道你们中的一些大师会对这样的事情采取什么方法.此外,我认为这是程序员不时要解决的常见问题,特别是如果您考虑的算法类似的问题.我对一个彻底的解决方案很感兴趣,其中至少包括所有部分的HINTS,以便快速有效地完成这项工作.谢谢!
关于如何生成地球上的随机坐标(纬度/经度)的任何聪明的想法?纬度/经度.精确到5点,避免水体.
double minLat = -90.00;
double maxLat = 90.00;
double latitude = minLat + (double)(Math.random() * ((maxLat - minLat) + 1));
double minLon = 0.00;
double maxLon = 180.00;
double longitude = minLon + (double)(Math.random() * ((maxLon - minLon) + 1));
DecimalFormat df = new DecimalFormat("#.#####");
log.info("latitude:longitude --> " + df.format(latitude) + "," + df.format(longitude));
Run Code Online (Sandbox Code Playgroud)
也许我生活在一个梦想的世界里,水话题是不可避免的......但希望有一个更好,更清洁,更有效的方法来做到这一点?
编辑
一些奇妙的答案/想法 - 然而,在规模上,让我们说我需要生成25,000个坐标.由于延迟,成本和一些其他因素,去外部服务提供商可能不是最佳选择.
Pandas数据帧中的每一行包含2个点的lat/lng坐标.使用下面的Python代码,计算许多(数百万)行的这两个点之间的距离需要很长时间!
考虑到2点相距不到50英里并且准确性不是很重要,是否可以更快地进行计算?
from math import radians, cos, sin, asin, sqrt
def haversine(lon1, lat1, lon2, lat2):
"""
Calculate the great circle distance between two points
on the earth (specified in decimal degrees)
"""
# convert decimal degrees to radians
lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])
# haversine formula
dlon = lon2 - lon1
dlat = lat2 - lat1
a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
c = 2 * asin(sqrt(a))
km = 6367 * c …
Run Code Online (Sandbox Code Playgroud) 我想创建一些GIS图,我想知道R是否可以用于此.以下是一些我在概念上与我想要的类似的情节示例:
我刚刚开始学习R,并想知道它是否适合这种工作.查看ggplot2的coord_map,看起来可能会将数据叠加到美国.但是,获取数据以尊重州界可能非常困难.
有什么建议?
我有一个名为"ind_adm"的shapefile和一个名为"pnts"的SpatialPointsDataFrame."pnts"包含随机生成的点,并且一些点与多边形重叠.见下图.
现在,我想在多边形分析中做一点,即我想找出哪些点位于代表印度边界的灰色多边形内.为此我在sp库中使用over()函数.
pt.in.poly <- sp::over(ind_adm, pnts, fn = mean) #do the join
Run Code Online (Sandbox Code Playgroud)
但是,我得到的输出是
>pt.in.poly
values
0 6.019467
Run Code Online (Sandbox Code Playgroud)
我应该得到多边形"在"中的点的索引.
我哪里错了?
我曾经读过有关地理定位数据的邮政编码的开源数据库,但现在我记不起它的名字了.有人可以帮忙吗?
编辑
这是正确的方法,以及文档:
import random
from osgeo import gdal, ogr
RASTERIZE_COLOR_FIELD = "__color__"
def rasterize(pixel_size=25)
# Open the data source
orig_data_source = ogr.Open("test.shp")
# Make a copy of the layer's data source because we'll need to
# modify its attributes table
source_ds = ogr.GetDriverByName("Memory").CopyDataSource(
orig_data_source, "")
source_layer = source_ds.GetLayer(0)
source_srs = source_layer.GetSpatialRef()
x_min, x_max, y_min, y_max = source_layer.GetExtent()
# Create a field in the source layer to hold the features colors
field_def = ogr.FieldDefn(RASTERIZE_COLOR_FIELD, ogr.OFTReal)
source_layer.CreateField(field_def)
source_layer_def = source_layer.GetLayerDefn() …
Run Code Online (Sandbox Code Playgroud) 我有一个包含大量多边形的geoJSON数据库(特别是人口普查区),我有很多长的纬度点.
我希望有一个有效的Python代码来识别给定坐标所在的人口普查区域,但到目前为止我的谷歌搜索还没有透露任何内容.
谢谢!