尝试初始化地图以使用 OpenMap 库呈现形状文件时无法获取地图片段
Can't get map fragment when trying to initialise the Map to render shapefile using OpenMap library
我一直在尝试使用 openmap 库显示 shapefile。单击第一个 activity 上的按钮后,应用程序转到第二个 activity(也是第二页),但随后突然崩溃。
我 运行 调试器发现 mapFragment 变量仍然为空,它正在从 findFragmentById 获取值。
我最终打算在我的应用程序的第二页上显示一个 shapefile。
public class ShapeFileParser extends AppCompatActivity implements OnMapReadyCallback {
GoogleMap mMap;
ShapeFile shapeFile;
File file;
public void setUpMap() {
try {
org.apache.commons.io.FileUtils.copyInputStreamToFile((ShapeFileParser.this.getAssets().open("healthsites.shp")), file);
} catch (IOException e) {
e.printStackTrace();
}
try {
shapeFile = new ShapeFile(file);
} catch (IOException e) {
e.printStackTrace();
}
try {
for (ESRIRecord esriRecord = shapeFile.getNextRecord(); esriRecord!=null; esriRecord = shapeFile.getNextRecord()){
String shapeTypeStr = ShapeUtils.getStringForType(esriRecord.getShapeType());
Log.v("myapp","shape type = " + esriRecord.getRecordNumber() + "-" + shapeTypeStr);
if (shapeTypeStr.equals("POLYGON")) {
// cast type after checking the type
ESRIPolygonRecord polyRec = (ESRIPolygonRecord)esriRecord;
Log.v("myapp","number of polygon objects = " + polyRec.polygons.length);
for (int i=0; i<polyRec.polygons.length; i++){
// read for a few layers
ESRIPoly.ESRIFloatPoly poly = (ESRIPoly.ESRIFloatPoly)polyRec.polygons[i];
PolygonOptions polygonOptions = new PolygonOptions();
polygonOptions.strokeColor(Color.argb(150,200,0,0));
polygonOptions.fillColor(Color.argb(150,0,0,150));
polygonOptions.strokeWidth(2.0f);
Log.v("myapp","Points in the polygon = " + poly.nPoints);
for (int j=0; j<poly.nPoints; j++){
//Log.v("myapp",poly.getY(j) + "," + poly.getX(j));
polygonOptions.add(new LatLng(poly.getY(j), poly.getX(j)));
}
mMap.addPolygon(polygonOptions);
Log.v("myapp","polygon added");
}
}
else {
Log.v("myapp","error polygon not found (type = " + esriRecord.getShapeType() + ")");
}
}
} catch (IOException e1) {
e1.printStackTrace();
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initializeMap();
}
private void initializeMap() {
if (mMap == null) {
SupportMapFragment mapFrag = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
// mapFrag is null on checking with the debugger
mapFrag.getMapAsync(this);
}
}
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
setUpMap();
}
}
这是我的 XML 文件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ShapeFileParser" >
<fragment
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
class="com.google.android.gms.maps.SupportMapFragment" />
</RelativeLayout>
我只是在尝试将形状文件渲染到第二页上的示例,但我觉得自从过去两天以来我无处可去。如果有的话,请提出一些意见。
我是android开发的新手,请耐心等待。非常感谢!
OpenMap 库用于 Java Swing 和 JFrame 应用程序,据我所知不能用于 Android 应用程序。 Google 地图 SDK 拥有在 Android 应用程序中显示地图所需的一切,包括获取设备位置、显示地点信息、设置地图标记、折线和多边形。在背景中获取位置更新等...要进行设置,请从图库中创建一个新的地图 Activity。它将为您生成所有需要的文件,并为您提供获取 API 密钥的说明列表,以便地图可以在您的应用程序中使用。 is a question explaining the security of your api key that I answered a while back. Google Maps Docs explains all the basic functionality of how to get Maps setup. I would recommend you visit some YouTube Tutorials 关于如何在您的 Android 应用程序中设置地图。
<--编辑-->
Here 是我大约两年前在 Stack Overflow 上找到的一个答案。它并没有真正使用 OpenMap Libray,但它是一种解决方法。您可以提取 ShapeFile 数据并在 Google 地图多边形、折线和 LatLng 类 中使用它,并在您的 android 应用程序的地图上显示它们。
我一直在尝试使用 openmap 库显示 shapefile。单击第一个 activity 上的按钮后,应用程序转到第二个 activity(也是第二页),但随后突然崩溃。
我 运行 调试器发现 mapFragment 变量仍然为空,它正在从 findFragmentById 获取值。 我最终打算在我的应用程序的第二页上显示一个 shapefile。
public class ShapeFileParser extends AppCompatActivity implements OnMapReadyCallback {
GoogleMap mMap;
ShapeFile shapeFile;
File file;
public void setUpMap() {
try {
org.apache.commons.io.FileUtils.copyInputStreamToFile((ShapeFileParser.this.getAssets().open("healthsites.shp")), file);
} catch (IOException e) {
e.printStackTrace();
}
try {
shapeFile = new ShapeFile(file);
} catch (IOException e) {
e.printStackTrace();
}
try {
for (ESRIRecord esriRecord = shapeFile.getNextRecord(); esriRecord!=null; esriRecord = shapeFile.getNextRecord()){
String shapeTypeStr = ShapeUtils.getStringForType(esriRecord.getShapeType());
Log.v("myapp","shape type = " + esriRecord.getRecordNumber() + "-" + shapeTypeStr);
if (shapeTypeStr.equals("POLYGON")) {
// cast type after checking the type
ESRIPolygonRecord polyRec = (ESRIPolygonRecord)esriRecord;
Log.v("myapp","number of polygon objects = " + polyRec.polygons.length);
for (int i=0; i<polyRec.polygons.length; i++){
// read for a few layers
ESRIPoly.ESRIFloatPoly poly = (ESRIPoly.ESRIFloatPoly)polyRec.polygons[i];
PolygonOptions polygonOptions = new PolygonOptions();
polygonOptions.strokeColor(Color.argb(150,200,0,0));
polygonOptions.fillColor(Color.argb(150,0,0,150));
polygonOptions.strokeWidth(2.0f);
Log.v("myapp","Points in the polygon = " + poly.nPoints);
for (int j=0; j<poly.nPoints; j++){
//Log.v("myapp",poly.getY(j) + "," + poly.getX(j));
polygonOptions.add(new LatLng(poly.getY(j), poly.getX(j)));
}
mMap.addPolygon(polygonOptions);
Log.v("myapp","polygon added");
}
}
else {
Log.v("myapp","error polygon not found (type = " + esriRecord.getShapeType() + ")");
}
}
} catch (IOException e1) {
e1.printStackTrace();
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initializeMap();
}
private void initializeMap() {
if (mMap == null) {
SupportMapFragment mapFrag = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
// mapFrag is null on checking with the debugger
mapFrag.getMapAsync(this);
}
}
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
setUpMap();
}
}
这是我的 XML 文件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ShapeFileParser" >
<fragment
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
class="com.google.android.gms.maps.SupportMapFragment" />
</RelativeLayout>
我只是在尝试将形状文件渲染到第二页上的示例,但我觉得自从过去两天以来我无处可去。如果有的话,请提出一些意见。
我是android开发的新手,请耐心等待。非常感谢!
OpenMap 库用于 Java Swing 和 JFrame 应用程序,据我所知不能用于 Android 应用程序。 Google 地图 SDK 拥有在 Android 应用程序中显示地图所需的一切,包括获取设备位置、显示地点信息、设置地图标记、折线和多边形。在背景中获取位置更新等...要进行设置,请从图库中创建一个新的地图 Activity。它将为您生成所有需要的文件,并为您提供获取 API 密钥的说明列表,以便地图可以在您的应用程序中使用。
<--编辑-->
Here 是我大约两年前在 Stack Overflow 上找到的一个答案。它并没有真正使用 OpenMap Libray,但它是一种解决方法。您可以提取 ShapeFile 数据并在 Google 地图多边形、折线和 LatLng 类 中使用它,并在您的 android 应用程序的地图上显示它们。